[英]Why does (function() { return this; }).call('string literal') return [String: 'string literal'] instead of 'string literal'?
這是我在嘗試使用JS時的最新發現:
(function() { return this; }).call('string literal');
// => [String: 'string literal'] in V8
// => String { "string literal" } in FF
在執行以下操作時我偶然發現了這一點:
(function() { return this === 'string literal'; }).call('string literal');
// => false
誰能告訴我,為什么this
里面的功能不完全是被作為第一個參數傳遞給call
?
編輯1
JavaScript中的字符串原語和String對象有什么區別? 已被標記為我的問題的可能重復。
雖然這兩個問題的答案都與JS如何在Objects中包含原語有關,但我相信這些問題及其答案並不相同。
我的問題是“為什么參數傳遞給調用並且函數內部的值不同?”而另一個問題是“為什么代碼塊1比代碼塊2更快?”
我的問題的正確答案是“因為你沒有使用嚴格模式”而另一個問題的答案與實現ECMAScript的引擎內部訪問數據的速度有關。
我希望這個澄清是正確的😅
.call
內部調用[[Call]]
,執行
- 執行OrdinaryCallBindThis(F,calleeContext,thisArgument)。
和OrdinaryCallBindThis
(這將把this
,那將被調用的函數的值),將包裝的新this
在非嚴格模式的對象:
如果thisMode是嚴格的,那么讓thisValue成為thisArgument。
其他,
一種。 如果thisArgument未定義或為null,則...
灣 否則,讓這個值得! ToObject(thisArgument)。
在嚴格模式下,您將看到字符串未包含在對象中:
'use strict'; (function() { console.log(this); console.log(this === 'string literal'); }).call('string literal');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.