作用域就不说了,先来理解一个概念:作用域链
当定义一个函数时,它实际上保存一个作用域链。
当调用这个函数时,它创建一个新的对象来存储他的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的‘链’。
下面来举个栗子:
var scope = ‘G scope‘;
function checkscope(){
var scope = ‘L Scope‘;
function f(){
return scope;
}
return f();
}
checkscope(); // ‘L Scope’
var scope = ‘G scope‘;
function checkscope(){
var scope = ‘L Scope‘;
function f(){
return scope;
}
return f;
}
checkscope()(); // ‘L Scope‘
简单来说, 定义 f 时候生成 的 作用域链保存了当前作用域的所有对象,包括 var scope = ‘L Scope’; 这个局部变量。
函数定义时的作用域链到函数执行时依然有效。这句话就是闭包的精髓了。
时间: 2024-10-07 18:44:16