这两个函数的范围有什么区别

时间:2017-01-19 08:02:11

标签: javascript function scope

我很抱歉,如果这太天真,只是在试图回答另一个问题时遇到困难。 :)在下面的代码中,bar.xbar.y都有相似/相同的函数体(最初声明函数的位置是否重要?)。我认为foo的范围在分配给y时会丢失,但是当我调用bar.y()时,为什么它不会在global_var内关闭x ?有y300可以输出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




2 个答案:

答案 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