一般我们呼叫Function时,都会写成funcName(arg1, arg2, ...)的形式。但像jQuery里的事件函数,都用this来存取触发事件的元素,若想由程序自行呼叫这些事件函数,就只能由元素去trigger()事件。传统funcName()的呼叫方式,因无法指定this,显然就无法满足这种情境下的需求。
apply()与call()是Function型别的两个Method,apply()的语法是funcName.apply(thisArg, argsArray),第一个传入的参数在就是函数中的this,而第二个参数则可传一个参数数组给该函数。call()与apply()用途相同,唯一的差别在于,call()必须一一明列出参数,例如funcName.call(thisArg, arg1, arg2, ...)。
底下是个例子,我写了一个Button Click事件,其中用了this.value去取Button的显示文字,并做一些后续的处理。范例里只是个alert,但如果这些处理逻辑很复杂,我们想应用在Button Click以外的其他用途,依正统的程序架构设计,应将这段逻辑拆出来变成独立函数,这样子就可以被Button Click事件以及其他程序所共享。
但如果函数是执行期间动态指定的,或者你只是临危受命加两行程序救火(火烧屁股时还坚持做Refactoring应该会被盖布袋),此时apply()就可以帮上大忙。在以下的例子里,我假造了一颗"伪"按钮,由于btnClick中只会用到this.value,我就宣告一个value属性充数。就这样,没有Button也能享用Button Click事件啰!
<html>
<head>
<script type='text/javascript'>
$(function() {
function btnClick() {
alert("Button[" + this.value + "] clicked!");
}
$("#a").click(btnClick);
var virtualButton = { value: "V" };
btnClick.apply(virtualButton);
});
</script>
</head>
<body>
<input type="button" value="A" id="a" />
</body>
</html>