我想使用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()方法调用带参数的函数。
答案 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"]);