请看下面的代码并解释:我做错了什么?
function doStuff(a, b){ return a + b + 1 ; } var myContext = { c: 1, d: 3 }; // myContext = this (result => 5) doStuff.call(myContext,myContext.c,myContext.d) // ... so why doesn't the below work? (result => NaN) doStuff.call(myContext,this.c,this.d) // To make the above work, i must replace "this" with "myContext" (result => 5)... doStuff.call(myContext,myContext.c,myContext.d) // ...which is no different to... doStuff(myContext.c,myContext.d) // ...so what was the point of call() method?
我厚吗?
答案 0 :(得分:3)
call
的要点是在函数中设置this
的值。由于您的doStuff
未在函数中使用this
,因此使用call
毫无意义。
以下是一个重要的例子:
function doStuff(a, b) {
return this.sum(a, b);
}
var obj = {
sum: function(a, b) {
return a + b;
}
};
console.log(doStuff.call(obj, 3, 4)); // 7, because `obj` has a `sum` property
console.log(doStuff(3, 4)); // Fails with an error that `this.sum` is not a function
那么为什么以下工作呢? (result => NaN)
doStuff.call(myContext,this.c,this.d)
因为this.c
在调用doStuff
之前评估,所以使用当前this
值。您如何调用该代码,this
是(在松散模式下)全局对象(窗口对象,在浏览器上),可能没有c
或{ {1}}财产。 (在严格模式下,再次假设你如何调用它,你会得到一个例外,因为d
是this
,你无法从undefined
检索属性{1}}。)
答案 1 :(得分:0)
.call
和.apply
是函数方法,用于“操纵”this
在函数内的含义。
doStuff.call(myContext, myContext.c, myContext.d)
:
在这里,您已将myContext
设置为doStuff
函数的上下文
你可以用this
在里面引用它,
你已经传递了两个参数:myContext.c,myContext.d,
它按照你的意图工作......
doStuff.call(myContext, this.c, this.d)
:
再次myContext
是doStuff()
的上下文
但您已通过.c
指向的.d
和this
属性
在你的情况下它出现的上下文(全局对象,窗口)。
所以doStuff
的上下文是 myContext ,参数是2 undefined
s,
因为this === window
在你调用函数的上下文中,
并且您将.c
的{{1}}和.d
属性传递给函数。
你实际上得到了这个:global
(NaN)
如果你像这样重新定义'doStuff':
return undefined + undefined + 1;
并将其称为:
function doStuff () {
return this.a + this.b + 1;
// here it looks whatever this is set to
// by `.call()` or `.apply()` methods
}