很多地方都有关于 JavaScript 方法“调用”和“应用”的解释。但是,我找不到任何关于使用()
. 例如:
var a = function(arg){
//arg.call();
//arg.apply();
//arg();
}
var myParam = function() {
//do someting
}
var instance = new a(myParam);
我应该使用哪种方式?调用方法的缺点是什么()
?
很多地方都有关于 JavaScript 方法“调用”和“应用”的解释。但是,我找不到任何关于使用()
. 例如:
var a = function(arg){
//arg.call();
//arg.apply();
//arg();
}
var myParam = function() {
//do someting
}
var instance = new a(myParam);
我应该使用哪种方式?调用方法的缺点是什么()
?
调用函数有三种方式。
Direct: myFunction(Object arg1, Object arg2, ...);
Call: myFunciton.call(Object this, Object arg1, Object arg2, ...);
Apply: myFunction.apply(Object this, Array args);
每个都有自己的特点。call()
唯一的缺点apply()
可能是它们的性能很差。经过一些研究,结果发现它们比直接调用函数要慢一点。虽然如此之少,甚至不值得考虑。
因为没有很大的缺点,我们可以只看优点来选择方法。这意味着,比较功能并选择适合您的情况。
.call();
与直接调用函数不同,.call()
允许您设置this
关键字。除此之外,它实际上是相同的。那么为什么要设置this
关键字呢?看看下面的例子。
var element = document.getElementById('my-element');
doSomething(element, function(success) {
if(success) {
// something succeeded!
// because I passed "element" as "this",
// I can use "this" to do more stuff with "element"
this.style.display = 'none';
}
});
function doSomething(element, callback) {
// do something with element
// I'm done, let's call the callback
callback.call(element, success);
}
如您所见,this
回调参数中的 指的是我们一直在使用的元素。这就是我们喜欢使用的this
原因,因为……它是有道理的!尤其是当您使用对象时。
.apply();
就像.call()
直接调用函数非常相似,.apply()
带有另一个特性。可以使用数组来定义参数,而不是允许程序员定义一组参数。这使您可以拥有动态数量的参数。
您可能熟悉Math.max()
. 此函数接受未定义数量的参数,并返回最大的数字。
Math.max(1, 2, 3); // 3
Math.max(1, 3, 2); // 3
Math.max(1, 2, 3, 2, 3, 1, 2, 3); // 3
如果我们有一个数字数组,也许来自一个提要,我们想得到最大的数字怎么办?这显然会起作用:
var numbers = [1, 6, 2, 8, 10, 6, 13, 5, 2, 8, 7, 75, 23, 7, 12, 75];
// Prepare "max"
// Anything is greater than -Infinity
var max = -Infinity;
// Loop through all numbers
for(var i = 0; i < numbers.length; i++) {
// Compare current number with existing max
max = Math.max(max, numbers[i]);
}
您正在浪费宝贵的时间循环所有数字,而您可以让本机代码为您完成。这就是.apply()
派上用场的地方。虽然我们有能力设置this
,Math.max()
不使用this
关键字,所以我们可以丢弃它并使用它null
。数组中有多少元素并不重要。
var numbers = [1, 6, 2, 8, 10, 6, 13, 5, 2, 8, 7, 75, 23, 7, 12, 75];
var max = Math.max.apply(null, numbers); // Apply all array elements as an own argument
这些方法中的任何一种都没有(明显的)缺点。做任何看起来最适合这种情况或你最喜欢的事情。
如果您不需要.call
或.apply
提供的“功能”,即设置this
或传递参数数组,则无需使用它们。
用 just 调用函数()
是调用函数的“正常”方式。