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

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)


CMS*_*CMS 8

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

test(this).apply(body);
Run Code Online (Sandbox Code Playgroud)

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

对该undefined值的属性访问权限为您提供了TypeError例外.

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

test.apply(this, [body]);
Run Code Online (Sandbox Code Playgroud)

但这就是为什么该call方法存在,当你确切知道要传递哪些参数时,你不需要为任何东西创建数组,你只需传递参数:

test.call(this, body);
Run Code Online (Sandbox Code Playgroud)

apply当您处理例如动态数量的参数时,当您知道哪些参数想要传递,并且仍然能够设置this值时,该方法非常有用,call正是您所需要的.


bit*_*yan 6

使用apply,您将发送一个参数数组作为其第二个参数:

test.apply(body,["Hello World"]);
Run Code Online (Sandbox Code Playgroud)

以下是MDN文档的应用文档https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply