超级简单的功能:
function equals(a,b){return a==b;}
当我这样调用它时它工作正常并返回true:
equals(1,1)
当我这样称呼它虽然它返回false,但我不明白为什么:
equals.call(1,1)
我认为调用function.call与简单地调用函数是一样的。我在这里缺少什么?
答案 0 :(得分:4)
.call
期望的第一个参数是该函数调用中this
的值,后跟您要传递给函数的参数。
由于您的函数不包含对this
的引用,您可以通过传递null
作为第一个参数来获得所需的结果:
equals.call(null, 1,1);
您可以在MDN文档Function.prototype.call
答案 1 :(得分:2)
Function.prototype.call
中的第一个参数是函数将视为this
的值。由于该功能不使用this
,您可以传递任何您喜欢的内容,例如null
:
equals.call(null, 1, 1)
答案 2 :(得分:1)
正如here所述:
call()方法调用一个给定此值的函数 论据单独提供。
第一个参数是this
:
function.call(thisArg, arg1, arg2, ...)
因为你传递的值为1,所以它被用作this
,这显然是不正确的。您应该在开始时传递null
和两个数字。
equals.call(null, 1, 1)
答案 3 :(得分:1)
使用.call
时的第一个参数是“this”的引用。
请参阅此jsFiddle以获取示例:https://jsfiddle.net/4hfrc3sk/
答案 4 :(得分:1)
调用的第一个参数应为this
。像这样:
equals.call(this,1,1)
在你的版本中,它试图将一个与undefined进行比较,因为没有提供第三个参数。
在此处阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
答案 5 :(得分:1)
.call的第一个参数是context(= what" this"也会引用)。
所以你可以这样做:
equals.call(undefined, 1, 1);
但这是毫无意义的。
更多关于.call的阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
答案 6 :(得分:0)
如果要执行调用而不指定null或undefined作为第一个参数,则可以按如下方式重写代码:
function equals(a,b) {
var w = window;
return (w.a == w.b);
}
d = document;
d.g = d.getElementById;
var a = 1;
var b = 1;
var res = equals.call(a,b);
d.g("answer").innerHTML= "\n<BR>" + a + " == " + b + "? " + res + "\n";
a = 5;
b = 9;
res = equals.call(a,b);
d.g("answer").innerHTML += "\n<BR>" + a + " == " + b + "? " + res;
&#13;
#answer {
font: 22pt Arial,Helvetica;
color: #090;
}
&#13;
<div id="answer"></div>
&#13;
请参阅resource
但是,如果您只想在函数调用中提供null或undefined的上下文,请确保在函数定义中省略该参数,否则可能会出现错误的结果;请参阅good和bad。