在很多地方都有关于JavaScript方法“call”和“apply”的解释。但是,我找不到有关使用()
调用函数的任何解释。
例如:
var a = function(arg){
//arg.call();
//arg.apply();
//arg();
}
var myParam = function() {
//do someting
}
var instance = new a(myParam);
我应该使用哪种方式?使用()
调用方法有什么缺点?
答案 0 :(得分:3)
有三种方法可以调用函数。
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
如果我们有一个数字数组,也许来自一个Feed,我们希望获得最大数字怎么办?这显然有效:
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
任何这些方法都没有(明显的)缺点。做任何看起来最适合这种情况或你最喜欢的事情。
答案 1 :(得分:1)
如果您不需要.call
或.apply
提供的“功能”,即设置this
或传递参数数组,则无需使用它们。
调用只有()
的函数是调用函数的“正常”方式。