![](/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.