javascript漫谈(二):闭包

September 3, 2016 at 7:27 pm

这两天睡的时间相当的长,脑袋已经有点麻木了,真正顺着这个思路,慢慢地回血吧。今天挖出了很多个月前的对于javascript的坑,虽然说接下来写javascript的机会越来越少...... javascript中的闭包是一个对于初学者(如我)来说非常容易感到困惑的术语。这个术语经常听到,但是却很难说清楚它到底是什么。实际上对于闭包的使用目前来看我使用的也并不多,所以也没有什么资格说它到底是好还是坏,本文主要是从一些基本的概念出发,简单分析一下闭包到底是什么。 javascript中的变量作用域 在传统的编程语言(如C语言)中,每个变量都有自己的作用域,通常,它们被分为全局变量和局部变量两个大类。全局变量可以在任何地方被访问到,而局部变量仅在定义自己的作用域中才可以被访问。通常来说,在函数内部定义的变量,其作用域在函数内部,外部函数是无法访问的。 在javascript中,函数中声明的局部变量也无法在函数外部被直接访问(如果省略关键字var,那么实际上定义的是全局变量),下面的代码会报错。 function a_function() { var dd = 5; } a_function(); alert(dd == null); 这样的结果非常直观、自然。那如果在内部访问外部变量又是怎样的情况呢? 下面的代码会输出什么呢?如果依次再注释掉标记为1,2,3的行,输出又是什么呢? var […]

javascript漫谈(一):javascript世界中的对象构造

May 16, 2015 at 8:57 pm

第一次写javascript代码应该是很多年以前的事了,最初写的时候都还没能把PHP和javascript之间的区别理解清楚。当年写的图书管理系统,わざわざ地模仿了教务管理系统中当鼠标放在按钮上时按钮会变动的效果,那算是真正意义上第一次写。再后来估计就没写过了,一直到BS课上,写了一个空有虚壳的购物系统,之后是C#版的ThinkSNS微博迁移计划,这个时期都是jquery了。最近因为某个契机被当了回“前端”,想着阿既然写了一点代码了不如再多学一点吧不能再写那么傻逼的拿不出去的javascript了。 第二次刷新对javascript的认识是在玩MongoDB的时候。那时候才发现阿原来javascript也可以不做前端来用阿,当时老大还问了“JS是不是不能读取文件的?”,这个问题我倒是记住了。那时可能略微瞥过一眼Nodejs,但是也就那么一瞥,除了多知道了一个名词外再无他了。 本系列漫谈主要是记录javascript世界中的知识,可能或多或少的会提到jquery,MongoDB,Nodejs之类的。说实话本系列我也不知道会走多远,毕竟“我!不!是!前!端......”,无论如何,本系列会着重强调javascript中和传统编程语言不一样的地方。 作为开篇,本篇讨论的是javascript中的对象构造。 javascript中的一切东西都是对象。 似乎很少有语言可以这么说,但是我觉得javascript说这句话问心无愧。(作为一个准python程序员,python中的类是对象吗?这似乎是一个我需要探究一下的问题。) 我们可以通过下面的方式创建两个对象: var oObject = new Object(); var oStringObject = new String(); 表面上看这和一般的面向对象语言并无不同。按照Java的说法,我们定义了一个Object类的对象和一个String类的对象,Ojbect()和String()是不带参数的构造函数。如果硬要说不同的话,javascript允许不带参数的构造函数省略括号,正如C++中那样(事实上在c++中带括号和不带括号行为是不同的,当然这里不扯这个)。但是等等,javascript中有这样一个事实。 javascript中没有类。 是的。javascript中没有class关键字,更不用说public,private了(访问控制的解决方案,呃,加个下划线什么的,一定要告诉你的客户不要改下划线前缀的成员orz)。javascript的对象可以在任意时刻增加成员,由于“一切都是对象”,所以函数也是一样。下面的代码展示了最原始的过程。 […]