我在Javascript中阅读范围链但它对我没有任何意义,任何人都可以告诉我什么是范围链以及它如何与图形或甚至白痴都能理解的东西一起工作.我用谷歌搜索但我没有找到可理解的东西:(
提前致谢.
在我的顶级函数中,我使用require.js导入一些依赖项.他们在那里,没问题.在这个函数中,我定义了一个回调函数,并尝试使用通过require.js导入的一些变量,即父闭包中的变量.
他们只是不在那里,正如一个断点和偷看Chrome检查员的Scope Variables面板所证实的那样.
我理解这一点fn.apply和朋友只是设置上下文this,而不是他们可以销毁对闭包的引用或改变范围链.
define([
'backbone',
'backbone.vent',
'app/utils/foo',
'app/services/intent'
], function(Backbone, Vent, Foo) {
'use strict';
// Backbone, Vent, and Foo are defined here
Vent.on('myevent', function(options) {
// Backbone is defined here, but not Vent or Foo.
});
});
Run Code Online (Sandbox Code Playgroud)
这怎么可能呢?
我该如何解决?
如果变量在需要时在函数中不可用,那么它将在作用域链中查找(这是一个闭包),但有时它会在原型链中进行搜索.我正试着把头包裹起来,当时正在发生这种情况.我想知道是否有人可以为我清除薄雾,或者让我参考一些专门讨论这个主题的文献.
例如,我是否正确地说: - 对象和因此与上下文绑定的公共变量(this)总是在原型链中查找? - 私有变量总是在作用域链中查找(即执行上下文中的函数链)? - 当程序同时查看两者中的任何一种情况时是否存在?
我测试了三种不同的场景(范围链查找,原型查找和没有查找),但不幸的是它没有足够的帮助到达底部.
var Food = function(){
var t = 1; // for closure
this.timeToPrepare = function(){ // Scope chain lookup
console.log(t * 3);
};
this.timeToMake = function(){ // This is looked up in the prototype chain
console.log(this.t * 3);
};
this.timeToEat = function(t){ //No lookup
console.log(t * 3);
};
};
Food.prototype.t = 2;
(function(){
var pizza = new Food;
pizza.timeToPrepare(); //3
pizza.timeToMake(); //6
pizza.timeToEat(3); //9
})();
Run Code Online (Sandbox Code Playgroud)

谢谢!
我已经读过了由于范围链如何在javascript中工作,如果我们希望引用未在F范围内声明的函数F中的变量V,那么声明一个是有益的(在性能方面是肯定的) F中的局部变量V2引用V,然后访问V引用的对象到V2.
我想知道这个概念是否适用于C#和VB中的闭包(通过lambdas访问函数中的局部变量)
Public Shared Function Example()
Dim a = 1
Dim b = New Object
Return Sub()
'when we use the variables a and b from here does it have to "go up the scope chain"
End Sub
End Function
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果答案不是过早的优化,那么我更愿意是所有邪恶的根源
var x = 9;
var mod = {
x: 81,
assign: function(){
this.x = 9;
x = 3;
},
checkVars: function(){
alert(x + " - " + this.x );
}
};
mod.checkVars(); //9 - 81
mod.assign();
mod.checkVars(); //3 - 9
alert(x); //3
Run Code Online (Sandbox Code Playgroud)
请解释范围链如何在这里设置自己.为什么范围解析为xin checkVars和assignskip对象mod?
javascript ×5
scope-chain ×5
closures ×2
scope ×2
c# ×1
object ×1
oop ×1
requirejs ×1
vb.net ×1