2011-10-06 55 views
14

我想使用javascript apply()方法调用函数。如果函数没有参数,这工作正常。即在JavaScript中调用具有参数的应用方法

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()方法来调用带参数的函数。

回答

26

apply的申请文件有两个参数:

test.apply(null, [body]); 

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

在你的例子如下,你可以把它改写:

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

,并调用它,如下所示:

test.apply(this); 
+0

重要的是要注意,第二个参数应该是一个数组,而不仅仅是一个单一的元素。 'test.apply(null,body)'为我打破了(Chrome 35),但'test.apply(null,[body])'起作用。 – FeifanZ

+0

使用apply方法的真正用处是什么好处? – Thunder

+1

我确定有很多真正的用途。有些人想到的是猴子补丁函数(包括内置函数),[可变参数函数](http://en.wikipedia.org/wiki/Variadic_function),以及为回调函数指定'this'。 –

0

请务必在参数添加:

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

第一注意你实际上是在调用你的函数,行:

test(this).apply(body); 

失败,因为在第一次,你叫test函数传递this作为参数,然后尝试在该函数的结果,这是undefined,因为你的函数不返回任何访问apply属性。

undefined值上的该属性访问给出了TypeError异常。

现在,让我们看看你真正想做的事,如果你想通过body变量作为函数的参数的值是什么,设定外this价值,为testthis值,你可以这样做:

test.apply(this, [body]); 

但是,这就是为什么call方法存在,当你确切地知道通过哪些参数,你不需要创建任何内容的数组,你只是传递参数:

test.call(this, body); 

当你处理例如动态数量的参数,当你知道哪些参数想要通过,并且仍然有能力设置this的值时,apply方法是非常有用的,call正是你所需要的。

+0

'call'的文档:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call –

相关问题