以下代码输出dafunc: this.foo = bar
var myObject = {
foo: "bar",
dafunc: function() {
console.log("dafunc: this.foo = " + this.foo);
}
};
myObject.dafunc();
为什么?
为什么函数dafunc
在this.foo
未定义的情况下有自己的范围?不是函数在Javascript中有自己的this
吗?
答案 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范围的变量。