javascript - 为什么 (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 的引擎在内部访问数据的速度有关。
我希望这个澄清是正确的
解决方案
.call
内部调用[[Call]]
,它执行
- 执行 OrdinaryCallBindThis(F, calleeContext, thisArgument)。
并且OrdinaryCallBindThis
(设置this
将要调用的函数的值)将以this
非严格模式将 new 包装在对象中:
如果 thisMode 是严格的,则让 thisValue 为 thisArgument。
别的,
一个。如果 thisArgument 未定义或为空,则 ...
湾。否则,让 thisValue 成为 !ToObject(thisArgument)。
在严格模式下,您会看到字符串没有被包裹在对象中:
'use strict';
(function() {
console.log(this);
console.log(this === 'string literal');
}).call('string literal');
推荐阅读
- javascript - 当我尝试存储选择值时 setState 不起作用
- amazon-web-services - AWS SAM CLI:sam deploy with python3.8 Image failed
- c# - 使用 powershell 将多个 nupkg 文件推送到 Github 包?
- html - 按钮不会改变背景颜色,也不会悬停
- android - 预装的 PdfViewerActivity 不适用于 SelfSigned 可信用户证书 Android 11 版本 2
- sql - 从 Teradata 到 Snowflake 的 SQL 转换,格式为 '9(13) V9(2)'
- python - pandas dataframe中float64检测问题中的nan
- swiftui - ClipShape 过渡没有任何作用
- python - ImportError: DLL load failed: 动态链接库 (DLL) 初始化例程失败;TensorFlow
- python - 从一个特定的单词到另一个单词读取python中的文件并将其放入列表中