dku*_*ppi 16 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]
Run Code Online (Sandbox Code Playgroud)
但我似乎无法做同样的事情来调用具有参数的函数:
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".
Run Code Online (Sandbox Code Playgroud)
上面的例子完全是微不足道的,但我的问题是:如何使用apply()方法调用带参数的函数.
Joh*_*yes 30
apply 有两个参数:
test.apply(null, [body]);
Run Code Online (Sandbox Code Playgroud)
第一个参数设置this执行函数的值.第二个是该函数的参数数组.
在您的示例中,您可以按如下方式重写它:
function test() {
console.log(this);
}
Run Code Online (Sandbox Code Playgroud)
并将其称为如下:
test.apply(this);
Run Code Online (Sandbox Code Playgroud)
首先注意你实际上是在立即调用你的函数,行:
test(this).apply(body);
Run Code Online (Sandbox Code Playgroud)
失败,因为首先,你调用test函数this 作为参数传递,然后你尝试访问apply函数结果的属性,这是undefined因为你的函数不返回任何东西.
对该undefined值的属性访问权限为您提供了TypeError例外.
现在,让我们看看你真正想做什么,如果你想传递body 变量的值作为你的函数的参数,设置外部this值,你可以做的this值test:
test.apply(this, [body]);
Run Code Online (Sandbox Code Playgroud)
但这就是为什么该call方法存在,当你确切知道要传递哪些参数时,你不需要为任何东西创建数组,你只需传递参数:
test.call(this, body);
Run Code Online (Sandbox Code Playgroud)
apply当您处理例如动态数量的参数时,当您知道哪些参数想要传递,并且仍然能够设置this值时,该方法非常有用,call正是您所需要的.
使用apply,您将发送一个参数数组作为其第二个参数:
test.apply(body,["Hello World"]);
Run Code Online (Sandbox Code Playgroud)
以下是MDN文档的应用文档https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply
| 归档时间: |
|
| 查看次数: |
27764 次 |
| 最近记录: |