JavaScript学习笔记——闭包

本文详细介绍了JavaScript中的闭包概念,包括其定义、作用和工作原理。通过实例解释了闭包如何延伸变量的作用域,并探讨了在函数内部定义的函数如何形成闭包。同时,文章还分析了this指向问题,特别是当函数被调用时,闭包如何影响this的指向。通过对闭包和this的深入理解,有助于提升JavaScript编程能力。
摘要由CSDN通过智能技术生成

闭包

定义

闭包(closure)指有权访问另一个函数作用域中变量的函数。

作用

闭包延伸了变量的作用范围。

理解闭包

闭包的产生基于以下基础。

  1. 执行环境(或简称环境)定义了变量或函数有权访问的其他数据,决定了它们的各自行为。
  2. 每一个环境都有与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
  3. 全局执行环境是最外围的执行环境,而每个函数又有自己的执行环境。执行流进入一个函数时,函数的环境会被推入环境栈中。函数执行完毕后,环境栈将其弹出,将控制权还给上一个执行环境。
  4. 代码在一个环境中执行时,会创建变量对象的一个作用域链。其用途是保证对执行环境有权访问的所有变量和函数的有序访问。
  5. 标识符解析是沿着作用域链一级一级地搜索标识符的过程。从前端开始,一直延续到全局执行环境。
  6. 作用域链的前端始终是当前执行代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。
  7. 函数的活动对象最开始只包含arguments对象,第二个变量对象来自包含(外部)环境,第三个是包含环境的包含环境……直到包含环境为全局环境为止。
  8. 普通函数创建时,会创建一个包含全局作用域的作用域链。这个作用域链被保存在内部的[[Scope]]属性中。
  9. 普通函数调用时,会为函数创建一个执行环境,通过复制函数的[[Scope]]属性中的对象构建执行函数的作用域链。
  10. 在一个函数内部定义的函数会将包含函数的活动对象添加到它的作用域链中。包含函数执行完毕后,其执行环境会被销毁,但活动对象仍保存在内存中,因为内部函数的作用域链仍然在引用这个活动对象。直到内部函数被销毁后,包含函数的活动对象才会被销毁。

this指向的问题

  1. 观察下面的代码:
var name = "The Window";
var object = {
    name: "My Object",
    getNameFunc: function() {
        return function() {
            return this.name;
        };
    }
};

console.log(object.getNameFunc()());

上面最后一行的object.getNameFunc()()相当于:

var f = function() {
    return this.name;
}
f();

故上面的this指向window,且无闭包产生。

  1. 继续观察代码:
var name = "The Window";  
var object = {    
    name: "My Object",
    getNameFunc: function() {
        var that = this;
        return function() {
            return that.name;
        };
    }
};
console.log(object.getNameFunc()())

这里使用局部变量保存objectthis,而内部返回函数中使用到了that,产生闭包,that.name访问的即是object内的name局部变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值