我很抱歉,如果这太天真,只是在试图回答另一个问题时遇到困难。 :)在下面的代码中,bar.x
和bar.y
都有相似/相同的函数体(最初声明函数的位置是否重要?)。我认为foo
的范围在分配给y
时会丢失,但是当我调用bar.y()
时,为什么它不会在global_var
内关闭x
?有y
和300
可以输出global_var = 2
var foo = function(){
console.log("y", global_var)
}
var bar = (function b(){
var global_var = 300;
var x = function(){
console.log("x",global_var);
};
var y = foo;
return {x: x, y: y};
})();
bar.x(); //300
bar.y(); //2
setTimeout(bar.x); //300
setTimeout(bar.y); //2
吗?
Private Sub TextBox5_Change()
ActiveSheet.ListObjects("FailureLogStart").Range.AutoFilter Field:=1, _
Criteria1:="*", Operator:=xlFilterValues
End Sub

答案 0 :(得分:1)
将foo
分配给y
时没有任何关闭。函数foo
的范围是在定义的位置确定的,它位于代码示例的顶部,并且该函数体内的global_var
将始终引用{{ 1}}在第1行中(隐式)定义的变量,而不是具有相同名称的任何其他变量。
将global_var
分配给foo
对该功能的范围没有影响。完成的所有任务都是使y
可以从新变量中访问。
x和y是否可以输出300?
不是在定义函数时,如果你使用foo
,你可能会有类似于你期望的函数:
this

答案 1 :(得分:1)
最初声明函数的位置是否重要
是。函数的范围仅由声明的位置决定。
我猜想foo的范围在分配给y
时会丢失
没有。范围没有变化。
当我调用bar.y()时为什么不将global_var置于其闭包内?
因为函数的范围仅由声明的位置决定。
x和y是否可以输出300?
不要吝啬范围。
您必须重写该函数才能从其他地方获取数据,例如来自对象属性。
var global_object = {};
global_object.data = 1;
global_object.foo = function() {
console.log("y", this.data);
};
var bar = (function b() {
var local_object = {};
local_object.data = 2;
local_object.x = function() {
console.log("x", this.data);
};
local_object.y = global_object.foo;
return local_object;
})();
bar.x(); // 2
bar.y(); // 2
setTimeout(bar.x.bind(bar)); // 2
setTimeout(bar.y.bind(bar)); // 2