码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript闭包

时间:2015-12-05 23:59:43      阅读:470      评论:0      收藏:0      [点我收藏+]

标签:

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的变量(先找外部函数的局部变量,再找全局变量)

JavaScript闭包

标签:

原文地址:http://www.cnblogs.com/humanxiaoman/p/5022605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!