2015-08-24 31 views
5
var example = function() { 
    console.log(typeof this); 
    return this; 
}; 

在嚴格模式:example.call('test') # prints 'string'Function.prototype.call改變此類型,嚴格模式外;爲什麼?

否則,example.call('test') # prints 'object'

然而,console.log(example.call('test'))打印test(如你所期望)

爲什麼Function.call變化typeof 'test' === 'string'勢必this裏面example

+2

這不是'call'改變任何事情過去了。這是馬虎的模式,強制「this」值到一個對象(在這裏是一個String對象)。 – Bergi

回答

5

當使用call()並設置this參數爲原始值,該原始值將被轉換成一個對象,所以你得到的字符串對象,而不是原始的字符串

String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ... 

call()的文件MDN指出

thisArg
爲調用該函數提供的值this
請注意,這可能不是該方法看到的實際值:如果該方法是非嚴格模式代碼中的函數,則nullundefined將替換爲全局對象,並且原始值將轉換爲對象。

所以在非嚴格模式的原始字符串值被轉換爲一個對象,這也在ECMA standard, Annex C

嚴格模式限制中指定與例外
如果this是在嚴格模式代碼內評估,則this值爲 不強制爲對象。
此值nullundefined未轉換爲全局對象,並且原始值未轉換爲包裝對象。
this值通過函數調用(包括使用Function.prototype.applyFunction.prototype.call的呼叫)不傳遞this值強制爲對象

+0

不是對你的帖子的批評,而是「盒裝」?爲什麼當規範說明更爲連貫的「強制對象」時,人們不必要地引入無意義的行話? – RobG

+0

@RobG - 誰知道,它是直接從MDN複製/粘貼的,它使用「boxed」,所以我繼續使用這個術語。 – adeneo

+1

它不再說「盒裝」了。 ;-) – RobG