闭包
1.我之前把闭包的函数作用域链的概念跟对象原型链的概念混淆起来了,现在我把我新的理解重新理解下,
闭包的概念是:有权访问另一个函数作用域中变量的函数;创建闭包的方法是:在一个函数内部创建一个函数;
有个很令人困扰的代码:
function creatdemo(){ var result = new Array(); for(var i = 0; i < 10 ; i++){ result[i] = function(){ return i; } } }
可能一开会认为,会返回相应的索引值,其实是不会的,到最后,result数组的值都是10,这是因为闭包里的那个函数,引用的是同一个外部函数的变量值,也就说,只能访问到最后
到最后一次的值。
解决的办法:
function createdemo(){ var result = new Array(); for(i = 0; i < 10; i++){ result[i] = function(num){ return function(){ return num; } }(i) } return result; }
这是因为 参数传递进去时,有复制一份,相当于值的复制,所以 这个值不会消失,能够传递到闭包函数中去;
2.关于this对象;
在闭包中使用this对象,也会出现一些问题;this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向window。
var name = "The window"; var object ={ name ="The object", getNameFunc : function(){ return function(){ return this.name; }; } } ; alert(object.getNameFunc()());//"The window"
由于getNameFun返回一个函数,一次调用函数getNameFun()();会立即调用返回的那个函数。。结果就是一个字符串;
为什么答案是the window呢? 每个函数在调用时,其活动对象都会自动的去获取两个变量 arguments this ,内部的函数在搜索时,只会搜索到其内部的活动对象,不会像向上
寻找到外部函数的活动对象中的这两个变量,所以,当内部函数在使用this时,理所因当的得到全局对象;从而得到the window 这个值。
3.模仿块级作用域;
在c和java中都有块级作用域这个概念;然而在JavaScript没有块级作用域。代码如下:
function demo(count){ for(var i =0 ; i < count ; i++){ alert(i); } var i;// JavaScript会对后续的声明视而不见; alert(i); }
匿名函数可以用作块级作用域;
(function(){ // 块级作用域; })()
4.私有变量;
在JavaScript中没有像java有私有变量的概念,但是,在函数中倒是有私有变量这个概念,函数中的参数变量,局部变量,函数内部定义的函数,闭包可以访问外部函数的变量,
和参数;
5.私有静态变量;
6.模块模式:
前面的方法是自定义类型的私有变量的公有化方法:现在介绍下:模块模式是指为单例创建私有变量和特权方法的;所谓的单例是只有一个实例的对象;
按照惯例,JavaScript是以对象字面量的方式来创建单例对象的;