标签:
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的变量(先找外部函数的局部变量,再找全局变量)
标签:
原文地址:http://www.cnblogs.com/humanxiaoman/p/5022605.html