首页 > 解决方案 > 为什么 (function() { return this; }).call('string literal') 返回 [String: 'string literal'] 而不是 '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 中的字符串原语和字符串对象有什么区别?已被标记为可能与我的问题重复。

虽然这两个问题的答案都与 JS 如何在 Objects 中包装原语有关,但我相信这些问题及其答案并不相同。

我的问题是“为什么传递给 call 的参数和函数内部 this 的值不同?”,而另一个问题是“为什么代码块 1 比代码块 2 快?”

我的问题的正确答案是“因为您没有使用严格模式”,而另一个问题的答案与实现 ECMAScript 的引擎在内部访问数据的速度有关。

我希望这个澄清是正确的

标签: javascript

解决方案


.call内部调用[[Call]],它执行

  1. 执行 OrdinaryCallBindThis(F, calleeContext, thisArgument)。

并且OrdinaryCallBindThis(设置this将要调用的函数的值)将以this非严格模式将 new 包装在对象中:

  1. 如果 thisMode 是严格的,则让 thisValue 为 thisArgument。

  2. 别的,

    一个。如果 thisArgument 未定义或为空,则 ...

    湾。否则,让 thisValue 成为 !ToObject(thisArgument)。

在严格模式下,您会看到字符串没有被包裹在对象中:

'use strict';
(function() {
  console.log(this);
  console.log(this === 'string literal');
}).call('string literal');


推荐阅读