需要在函数对象上调用JavaScript方法

时间:2013-05-23 15:20:50

标签: javascript

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

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

使用函数方法“call”调用此函数有什么好处,只需调用函数?,即。

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

VS

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

Fiddle-dee-dee:http://jsfiddle.net/wC3xz/1/

很抱歉,但是查看文档并没有任何消息。我唯一能想到的是你是否可以访问传递给函数的this对象。但是不会在匿名函数中访问它,这是匿名函数即窗口的上下文吗?

何时需要调用而不仅仅是functionname(args)?

4 个答案:

答案 0 :(得分:10)

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

第15.3.4.4节中的呼叫为defined in the spec。当您尝试在函数内部设置thisArg时,可以使用.call

我将如何使用它?

以下是如何使用的示例:

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

我什么时候使用它?

使用call时,这是一个非常规范的例子:

许多DOM方法返回NodeList。虽然NodeList是array-like object,但您无法在其上本地调用数组方法。但是,由于它们是数组,因此可以使用.call

对它们使用数组方法

如果您打开控制台并键入

document.getElementsByTagName("a").forEach

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

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

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

另一个常见的例子是arguments,它是另一个“Array Like”对象。通常,我们希望像数组一样处理参数,但我们不能。再次,.call来救援,我们可以做到:

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

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

答案 1 :(得分:2)

使用函数方法“call”调用此函数有什么好处,只需调用函数?

  • 无。仅当您要将上下文()传输到函数
  • 时,它才有用

何时需要调用而不仅仅是functionname(args)?

  • 当您想要在不同的上下文中调用现有方法时。例如,参数对象与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);
    

答案 2 :(得分:1)

您使用

.call

.apply

当涉及到覆盖时。

this是一篇了解更多内容的好文章。

答案 3 :(得分:0)

通常使用call()的好处是它允许您显式设置函数的上下文。对于你所展示的简单函数,没有多少价值,但如果你的函数是一个对象的方法,或者它是一个回调,设置上下文可能是相关的。