3

采用一个简单的匿名函数,它接受 3 个参数:

function hello(firstname, surname, city) {
    console.log('Hi ' + firstname + ' ' +
                        surname + '. I see you\'re from ' + city)
}

使用函数方法“call”调用此函数而不是仅调用该函数有什么好处?, IE。

hello('Jane','Mansfield','Philadelphia');

对比

hello.call(this,'Jane','Mansfield','Philadelphia');

小提琴迪迪:http: //jsfiddle.net/wC3xz/1/

抱歉,但是查看文档并没有发现任何问题。我唯一能想到的是,如果您可以访问传递给函数的 this 对象。但是在匿名函数的上下文中,即窗口中,不会从匿名函数中访问 this 吗?

何时需要调用而不仅仅是函数名(args)?

4

4 回答 4

10

那么打电话有什么大不了的呢?

调用在 15.3.4.4 节的规范中定义。.call当您尝试在函数内设置 thisArg 时使用。

伊藤将如何使用它?

这是一个如何使用它的示例:

var me = { name: 'dr.eval' }

foo.call(me); // if you omitted the 'call' it would error because this defaults to the window object.

function foo() {
    alert(this.name + ' is home');
}

你可以在这里阅读更多关于它的信息:Function.prototype.call

我什么时候使用它?

这是使用调用时非常规范的示例:

很多 DOM 方法返回NodeList. 虽然 NodeList 是一个类似数组的对象,但您不能在它们本身上调用数组方法。但是,由于它们在设计上类似于数组,因此您可以在它们上使用数组方法.call

如果您打开控制台并输入

document.getElementsByTagName("a").forEach

你会得到未定义的,因为它返回一个没有 forEach 方法的 NodeList。但是,可能需要迭代 NodeList,因此您可以执行以下操作:

[].forEach.call(document.getElementsByTagName("a"),function(elem){
     console.log(elem);
});

这将记录页面上的所有锚元素。

另一个常见的例子是arguments另一个“类似数组”的对象。通常,我们想像处理数组一样处理参数,但我们做不到。因此,再次.call进行救援,我们可以这样做:

[].slice.call(arguments,0); // returns a clone of arguments, but a real array we can work with!

它在处理事件时也很有用,总的来说它显示了 JavaScript 的灵活性。这是一种在对象之间共享功能的方法,否则这些对象将无法共享它。

于 2013-05-23T15:23:15.823 回答
2

使用函数方法“call”调用此函数而不是仅调用该函数有什么好处?

  • 没有任何。仅当您想将上下文(this)传递给函数时才有用

何时需要调用而不仅仅是函数名(args)?

  • 当您想在与定义不同的上下文中调用现有方法时。例如,arguments对象类似于Array,但不能sort()直接使用。

    function Test() {
      // call sort from Array context onto arguments object
      console.log(Array.prototype.sort.call(arguments)); // 2 3 5 8
      // error: arguments object doesn't contain sort
      console.log(arguments.sort());
    }
    Test(5,3,8,2);
    
于 2013-05-23T15:36:07.360 回答
1

你用

.call

.apply

当涉及到覆盖时。

this是了解更多信息的好文章。

于 2013-05-23T15:27:44.380 回答
0

一般来说,使用 call() 的好处是它允许您显式地设置函数的上下文。正如您所展示的那样,对于一个简单的函数来说没有太大的价值,但是如果您的函数是一个对象的方法或者它是一个回调,那么设置上下文可能是相关的。

于 2013-05-23T15:25:18.980 回答