在下面的javascript代码中,为什么func函数无法访问变量?

时间:2016-08-12 11:05:13

标签: javascript function scope

var func=function(){console.log(that)}
var obj = {
    foo(){
        var that=this;
        var a=func;
        a();
    }
}   

obj.foo();

结果:

未捕获的ReferenceError:未定义

3 个答案:

答案 0 :(得分:0)

that仅存在于foo内,因为它就是声明的地方。您的func功能超出foo,因此that变量不存在。

如果您希望能够在两个地方访问它,可以在两个函数之外声明它:

var that;
var func=function(){console.log(that)}
var obj = {
    foo(){
        that=this;  // <-- no  var
        var a=func;
        a();
    }
}   

obj.foo();

答案 1 :(得分:0)

因为JavaScript使用词法作用域,而不是动态作用域。这意味着在运行时调用范围时不会查找变量。只有源代码的嵌套结构很重要。

答案 2 :(得分:0)

您在that中没有引用func。要么将其声明为全局变量,要么将其作为参数传递给func

选项1:that作为参数传递

&#13;
&#13;
var func = function(that) {
  console.log(that)
}
var obj = {
  foo() {
    var that = this;
    var a = func(that);
    //invoke function a like this;
    a;
  }
}

obj.foo();
&#13;
&#13;
&#13;

选项2:that声明为全局变量

&#13;
&#13;
var that;

var func = function() {
  console.log(that)
}
var obj = {
  foo() {
    that = this;
    var a = func(that);
    //invoke function a like this;
    a;
  }
}

obj.foo();
&#13;
&#13;
&#13;