Siehe das folgende Schließungsproblem
var x=10;
function fn() {
console.log(x);
}
function show(f) {
var x=20;
(function() {
f();
})();
}
show(fn);
Es wird 10 statt 20 ausgegeben. Wenn x verwendet wird, wird dann nicht entlang der Gültigkeitsbereichskette nachgeschlagen? Wenn die Gültigkeitsbereichskette beim Erstellen der Funktion bestimmt wird, ist das Ergebnis 10. Wenn sie beim Erstellen der Funktion bestimmt wird aufgerufen, es sollte 20 sein. Ja Keine genaue Aussage über die Scope-Kette? Wie sollte hier die genaue Scope-Kette aussehen? Sind Fn und Show auf dem gleichen Niveau oder liegt Fn innerhalb von Show?
作用域链是在函数定义的时候确定的.
https://developer.mozilla.org...
作用域链是动态的,所以,在调用时确定。
但是你的这个代码中,闭包定义的function()是绑定的最外层的作用域
function所申明的函数默认是绑定的外层的作用域
(我也是在学习中。。。)
在函数创建的时候创建一个包含全局变量对象的作用域链,储存在内部[[Scope]]属性中。函数执行的时候会创建一个执行环境,通过复制[[Scope]]属性中的对象,构建执行环境的作用域链,并把自己的活动对象推入该作用域链的前端以此形成完整的作用域链。[[Scope]]保存的是对全局变量的引用,而不是值的复制。
闭包的调用方式和下面效果等价的,下面举得例子通过对比说明了,作用域链是和函数定义时位置相关的。
相关问题链接补充。/q/10...。有关于作用域链的讨论。
非严格模式任何IIFE的this指向都是window
以上文不对题。。。