gpt4 book ai didi

javascript - 何时以及为何使用“调用申请”?

转载 作者:行者123 更新时间:2023-11-30 12:43:07 24 4
gpt4 key购买 nike

首先我了解了apply()和call()的区别。

function theFunction(name, profession) {
alert("My name is " + name + " and I am a " + profession + ".");
}

theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]); // This call be called theFunction("Susan", "school teacher");, why use apply
theFunction.call(undefined, "Claude", "mathematician"); // This call be called theFunction("Claude", "mathematician");, why use call

从上面的代码来看,3个函数调用都显示了警告信息。

  1. 与普通的函数调用相比,使用 apply 和 call 的优点/缺点是什么,何时适合使用 apply/call,请说明。

  2. 还有一件事,如果函数是基于原型(prototype)的函数怎么办:

Function.prototype.theFunction = function(name, profession) {

    alert("My name is " + name + " and I am a " + profession + ".");
}

然后如何使用apply或call来调用这个函数bu。我试过这种方式:

theFunction.apply(undefined, ["Susan", "school teacher"]); 
theFunction.call(undefined, "Claude", "mathematician");

但导致错误。“ReferenceError:函数未定义”

最佳答案

正如您所说,您似乎已经知道这些函数 apply()call() 实际上做了什么,但就它们的用途而言,我d 说它们主要用于当你想为你的 function 提供你自己的特定对象时,作为它在其上下文中的 this 值。

这两者最流行的用途之一是处理类似数组的对象,例如函数中的 arguments 对象:

function(){
//let's say you want to remove the first parameter from the arguments object

//you can make sure that
console.log(arguments instanceof Array);//false

//as you see arguments is not an actual array object but it is something similar
//and you want slice out its value
var myparams = Array.prototype.slice.call(arguments, 1);

//here you have myparams without your first argument

console.log(arguments);
}

让我们再举一个例子。假设我们有一个独立的函数,例如:

function getName(){
console.log(this.name);
}

现在您可以将它用于任何类型的具有 name 属性的 JavaScript 对象:

var myInfo = {
name: 'SAM'
};

现在如果你这样做:

getName.call(myInfo);

它所做的是打印出 name 属性,或者您可以在函数本身上尝试:

getName.call(getName);

这将在控制台中打印出函数的名称 ("getName")。

但是和我的第一个例子类似,它通常在你想使用不在对象原型(prototype)链中的函数时使用。另一个例子可能是:

//let's say you have an array
var myArray = [1 , 2];
//now if you use its toString function
console.log(myArray.toString());//output: "1,2"

//But you can use the Object toString funcion
//which is mostly useful for type checking
console.log(Object.prototype.toString.call(myArray));//output: "[object Array]"

关于javascript - 何时以及为何使用“调用申请”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23649947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com