2011-11-28 110 views
1

我正在学习apply,我想了解为什么我正在学习的代码只传递一个参数来应用。为什么在这种情况下只适用一个参数?

我首先定义现状:

var Quo = function(string) { 
    this.status = string; 
}; 

接下来我定义GET_STATUS:

Quo.prototype.get_status = function() { 
    return this.status; 
}; 

我定义statusObject:

var statusObject = { 
    status: 'yo!' 
}; 

而这正是我迷失:

var status = Quo.prototype.get_status.apply(statusObject); 
// status is 'yo!' 

根据documentation“Apply调用具有给定此值和作为数组提供的参数的函数”。你可以看到在这种情况下,使用apply我只传递一个参数,我相信这是定义“this”。你能清楚这个方法究竟发生了什么,为什么应用是必要的,为什么在这种情况下,我只能通过一个参数的方法,当它声明两个是必要的。谢谢。

+1

'get_status'函数没有必要的参数,所以不需要提供任何参数。如果他们被提供,他们就会被忽略。代码可以很容易地使用'call'。 – zzzzBov

+0

'.apply'没有必要,'.call'也会做同样的事情。 '.apply'是将未知数量的参数传递给你不需要的函数的唯一方法。问题是什么? :) – Esailija

回答

3

apply设置功能的情况下被应用于第一个参数中提供的对象。

var o; 
function baz(a, b, c) { 
    //do stuff 
} 

o = { 
    foo: 'bar' 
}; 

baz.apply(o); 
//this is o 
//a is undefined 
//b is undefined 
//c is undefined 

如果数组被作为第二个参数传递,参数将被设置基于关闭数组中的值:

baz.apply(o, [1,2,3]); 

//this is o 
//a is 1 
//b is 2 
//c is 3 

apply第二个参数是可选的,然而call通常用于用于设置上下文:

//these do the same thing 
baz.call(o); 
baz.apply(o); 

//this is how they're different 
baz.call(o, 1, 2, 3); 
baz.apply(o, [1, 2, 3]); 
2

它并没有说明需要两个:

fun.apply(thisArg[, argsArray]) 

通知如何argsArray是在括号中,它是可选的。

通话中发生了什么,是您的statusObject作为this参数传递给您的get_status功能。

这意味着当get_status执行并确实return this.status它实质上返回statusObject.status

应用程序很有用,原因很多,其中之一是动态调用方法。我可以通过一个方法的字符串名称的对象被调用,像这样:

methods = { 
    init: function(message) { 
     alert(message); 
    } 
}; 
function executeFunc(method) { 
    methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
} 

//now I can call like this: 
executeFunc('init', 'Hey there, this is a message'); 

这样的例子可以在我的jQuery插件骨架被发现GitHub

0

apply采用一个参数,该对象为this使用,随后吨他论证如果有的话

如果函数没有参数,例如你有function f() { ... },你不需要传递任何参数,所以你可以拨打f.apply(someObject);

+0

它的JavaScript,你不*有*传递参数。只要你愿意接受不传递给他们的后果:) – Chad

相关问题