使用JavaScript中的参数调用apply方法

时间:2011-10-06 15:37:20

标签: javascript arguments apply

我想使用javascript apply()方法调用一个函数。如果函数没有参数,这可以正常工作。即。

function test()
{
  console.log(this);
}

body = document.getElementsByTagName("body")[0]; // shortcut to body element

test.apply(body); // returns [object HTMLBodyElement]

但我似乎无法做同样的事情来调用具有参数的函数:

function test(msg)
{
  console.log(msg);
}

body = document.getElementsByTagName("body")[0]; // shortcut to body element

test(this).apply(body); // mysteriously returns the correct result, then
// typeError: 'undefined' is not an object (evaluating "test(this).apply".

上面的例子非常简单,但我的问题是:如何使用apply()方法调用带参数的函数。

4 个答案:

答案 0 :(得分:29)

apply有两个参数:

test.apply(null, [body]);

第一个参数在执行函数时设置this的值。第二个是该函数的参数数组。

在您的示例中,您可以按如下方式重写它:

function test() {
    console.log(this);
}

并按如下方式调用:

test.apply(this);

答案 1 :(得分:8)

首先请注意,您实际上是在立即调用您的函数,行:

test(this).apply(body);

失败,因为首先,你调用test函数传递this 作为参数,然后你尝试访问函数的apply属性结果,undefined因为你的函数没有返回任何东西。

undefined值上的属性访问权限为您提供TypeError例外。

现在,让我们看看你真正想做什么,如果你想传递body变量的值作为你的函数的参数,设置外this值,作为{{ 1}} this的值,你可以这样做:

test

但这就是test.apply(this, [body]); 方法存在的原因,当你确切地知道要传递哪些参数时,你不需要为任何东西创建数组,你只需传递参数:

call

当您处理动态数量的参数时,test.call(this, body); 方法非常有用,当您知道要传递哪些参数时,仍然能够设置apply值,{ {1}}正是您所需要的。

答案 2 :(得分:6)

使用apply你发送一个参数数组作为它的第二个参数:

test.apply(body,["Hello World"]);

以下是有关MDN文档https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

的应用文档

答案 3 :(得分:0)

请务必添加参数:

test.apply(body, ["my message here"]);