![](/img/trans.png)
[英]Why does JavaScript's `function.call` have to be called explicitly?
[英]Why does javascript change primitive types when passed into function.apply() or function.call()?
看来,当使用一个原语类型(字符串,号码)作为this
函数调用的对象(作为第一个参数要么function.call()或函数应用于())时,原始类型被提升到它的对象当量(例如,一个字符串变成一个字符串)。
为了显示:
var f = function(x) { return [typeof(this), typeof(x)]; }
var obj = '123'
f.call(obj, obj)
>>> ["object", "string"]
也就是说,“this”成为一个对象(它是一个String对象,我已经检查过),而第二个调用参数成为函数“f”的第一个参数,并且仍然是一个原始字符串。
对象都是 “123”,但微妙的东西不起作用(例如,它们在“==”方面相同,但在“===”方面则不相同)。
我在chrome和firefox中都注意到了这种行为,所以我假设它有一个特定的原因。 我搜索过,但没有找到任何解释。 我很感激任何解释,希望通过某种方式链接到文档,解释有关此规则及其发生原因的规则。
这似乎是正确的行为。
http://bclary.com/2004/11/07/#a-15.3.4.4
Function.prototype.call - 被调用的函数作为此值传递给ToObject (thisArg)。
ToObject “根据以下内容将其参数转换为Object类型的值”:
String - 创建一个新的String对象,其[[value]]属性设置为字符串的值。
Javascript函数调用和Apply方法中的第一个参数确定必须在哪个上下文中运行所请求的函数。 所以这永远是一个对象
为了说明这一点,请查看以下示例
function totest()
{
this.ff = function(x) {
this.test(x);
};
this.test = function(x) {
alert(x);
}
}
function totest1()
{
this.test = function(x) {
alert(x);
}
}
function fun()
{
var obj = new totest();
var obj1 = new totest1();
obj.ff('hi'); //Runs fine without any problem
obj.ff.call(obj, 'sam') ; //Runs fine without any problem
obj.ff.call(this, 'sam'); //throws an error
obj.ff.call(obj1, 'sam'); //will be executed in the context of totest1
}
obj.ff.call(this,'sam')抛出一个错误。 为什么
因为我们指定obj.ff方法要在fun(或这里的窗口)的上下文中执行,而不是在totest的上下文中。
obj.ff.call(obj1,'sam')告诉调用在totest1()的上下文中执行ff,并且它有效,因为它得到了方法测试。
所以这必须是对象。
并且调用方法中的剩余参数对于要执行的方法是真实的。 所以他们会从给定的值推断出类型。
希望你现在能理解
短期和简单的:第一个参数变成如果物体是一个原始类型的,因为,正如你指出的那样,可能被提及this
在被调用的函数。 由于this
必须指向一个对象,运行时环境可以确保有实际上是一个对象引用。 想想你将如何实现它,你可能会得出同样的结论。 好问题。
PS:我很欣赏Ramesh的答案,这在技术上是说明性的,但是想为不耐烦的读者添加一个答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.