我不理解JavaScript中call()方法的要点

时间:2014-05-09 21:57:01

标签: javascript methods

请看下面的代码并解释:我做错了什么?


    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?

我厚吗?

2 个答案:

答案 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}}财产。 (在严格模式下,再次假设你如何调用它,你会得到一个例外,因为dthis,你无法从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): 再次myContextdoStuff()的上下文 您已通过.c指向的.dthis属性 在你的情况下它出现的上下文(全局对象,窗口)。 所以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

}