为什么对象的函数值没有自己的范围?

时间:2016-05-03 02:28:09

标签: javascript scope closures this

以下代码输出dafunc: this.foo = bar

var myObject = {
    foo: "bar",
    dafunc: function() {
        console.log("dafunc:  this.foo = " + this.foo);
    }
};
myObject.dafunc();

为什么?

为什么函数dafuncthis.foo未定义的情况下有自己的范围?不是函数在Javascript中有自己的this吗?

3 个答案:

答案 0 :(得分:1)

函数没有自己的this,它由调用者决定。

如果您myObject.daFunc() myObject var x = myObject.daFunc; x();

如果你做myObject.daFunc.apply(somethingElse),它将不会有用。

如果您执行somethingElse,则会this

我认为混淆来自于函数内部的this与定义函数的作用域中的this无关。因此,以这种方式,该函数确实有自己的var myObject = { foo: "bar", dafunc: function() { setTimeout(function(){ // now we lost "this", this doesn't work console.log("dafunc: this.foo = " + this.foo); }, 0); } };

this

这是某些Javascript版本的“fat-array”语法所在。这里 setTimeout( () => { // fat array "preserves" this console.log("dafunc: this.foo = " + this.foo); }, 0); 从定义范围延续:

X = c(14, 5, 2, 8 , 9, 10)

Y = c(7, 3, 4, 13, 11, 12)

答案 1 :(得分:0)

当您这样称呼时:myObject.dafunc(); this值为myObject

在你的代码中,如果你试试foo会发生什么? (undefined

答案 2 :(得分:0)

在javascript中,this指的是调用函数的对象。使用该对象考虑范围。由于函数是使用myobject对象调用的,因此它由myobject的范围组成,该范围具有foo定义。我想如果只说foo而不是this.foo,它会考虑新的foo变量,而不是来自myobject范围的变量。