您的位置:首页 > Web前端 > JavaScript

JavaScript闭包

2015-12-05 23:44 337 查看
1、定义

指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

2、作用域链

向上查找,一直找到全局变量的为止。(局部(参数列表)->全局)如果查找不到则undefind.

3、几种闭包

1)简单闭包

a)函数(对象):this默认为当前对象,不带this的变量(先找局部变量,再找全局变量)

2)复杂闭包

a)函数中的函数:this默认为全局window. 不带this的变量(先找外部函数的局部变量,再找全局变量)

b)函数中的函数:通过call传递作用域后,this指向传递的作用域. 不带this的变量(先找外部函数的局部变量,再找全局变量)

c)函数中的函数不会接收变量.

4、简单闭包的实例

在函数中使用全局变量是一个简单的闭包实例。请思考下面这段代码:

var sMessage = "hello world";

function sayHelloWorld() {//闭包
alert(sMessage);// 不被计算的变量
}

sayHelloWorld();//计算sMessage


在上面这段代码中,脚本被载入内存后,并没有为函数 sayHelloWorld() 计算变量 sMessage 的值。该函数捕获 sMessage 的值只是为了以后的使用,也就是说,解释程序知道在调用该函数时要检查 sMessage 的值。sMessage 将在函数调用 sayHelloWorld() 时(最后一行)被赋值,显示消息 "hello world"。

5、复杂的闭包实例

在一个函数中定义另一个函数会使闭包变得更加复杂。例如:

var iBaseNum = 10; //window

function addNum(iNum1, iNum2) {
function doAdd() { //闭包
return iNum1+ iNum2+ iBaseNum;
}
return doAdd();
}


这里,函数 addNum() 包括函数 doAdd() (闭包)。内部函数是一个闭包,因为它将获取外部函数的参数 iNum1 和 iNum2 以及全局变量 iBaseNum 的值。 addNum() 的最后一步调用了 doAdd(),把两个参数和全局变量相加,并返回它们的和。

这里要掌握的重要概念是,doAdd() 函数根本不接收参数,它使用的值是从执行环境中获取的。

小结:

闭包:

1. 函数内部访问全局变量

2. 内部函数闭包:

a) 外部函数 和 全局变量

6、更复杂的面向对象的闭包

var testvar = 'window属性';
var o3 = {
testvar:'3',
testvar2:'999',
fun:function(){
//var testvar = 'inner fun属性';
//alert('o3: '+this.testvar); //o3
//alert('o3: '+testvar);       //window

var inner = function(){
//当前对象的作用域+全局作用域 :闭包
//alert('o3-inner: '+this.testvar);
//alert('o3-inner: '+this.testvar2);
//alert('o3-inner: '+testvar);
};
inner();                //this->window
//inner.call(this);    //this->o3   不带this:外部函数  >  window  > undefind
//inner.call(o2);         //this->o2   不带this:外部函数  >  window  > undefind
}
};
o3.fun();//可以调用非o3声明的成员变量


【温馨提示】《JS教程词法作用域和闭包-Javascript-Ajax-网页制作-网页教学网》改文件上传到百度云盘,有需要继续学习的小伙伴可自行下载。

账号:http://pan.baidu.com/s/1bxWTIm

密码:qu9v

a)
函数中的函数:通过call传递作用域后,this指向传递的作用域. 不带this的变量(先找外部函数的局部变量,再找全局变量)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: