🌺
摘要
js闭包的实现
闭包
1.闭包的发生时机
闭包本质是一个函数,是指那些引用了另一个函数作用域的变量的函数,通常是嵌套函数实现的. 闭包引用那个变量的函数上下文不会立即销毁,除非闭包被销毁.但是执行上下文的作用域链,会在执行完,立马销毁.
function a() {
let a = null;
return function () {
a = 2;
};
}
a();
2.闭包的意义:
- 延长了变量的生命周期.
- 创建私有环境
3.执行期上下文
* 执行期上下文分为全局执行期上下文、函数执行期上下文、eval的执行期上下文,这里总结前两种。*
- 全局执行期上下文:只有一个,称为GO。
- 函数执行期上下文:基于函数定义时的上下文,在被调用或执行前去创建自己的执行期上下文,即为自己的AO。注意:函数执行期上下文由在哪里定义决定,而不是调用时决定。
- 3. 执行期上下文生成过程
- 函数调用前基于函数定义时的作用域链创建自己的AO(执行期上下文),置于作用域链的组顶端
- 查找函数内声明的变量和形参,其值为undefined
- 把形参的值变为实参
- 查找函数内的函数声明,其值为函数体
函数不能直接访问其他函数的this和arguments
var name = "the window";
var obj = {
name: "my obj",
getNameFunc() {
return function () {
return this.name;
};
},
};
console.log(obj.getNameFunc()()); //the window
var name = "the window";
var obj = {
name: "my obj",
getNameFunc() {
var that = this;
return function () {
return that.name;
};
},
};
console.log(obj.getNameFunc()()); //my obj
var name = "the window";
var obj = {
name: "my obj",
getNameFunc() {
const a = "eee";
return function () {
return a;
};
},
};
console.log(obj.getNameFunc()()); //eee 文章最后更新于 2024-08-20 16:33:43
作者:徐徐转载请注明出处