这是我尝试JS时的最新发现:
(function() { return this; }).call('string literal');
// => [String: 'string literal'] in V8
// => String { "string literal" } in FF
Run Code Online (Sandbox Code Playgroud)
我在执行以下操作时偶然发现了这一点:
(function() { return this === 'string literal'; }).call('string literal');
// => false
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么this在函数内部不完全是作为第一个参数传递给的call?
编辑1
字符串基元和JavaScript中的String对象有什么区别?已被标记为我的问题的可能重复项。
虽然这两个问题的答案都与JS如何在Objects中包装原语有关,但我认为这些问题及其答案并不相同。
我的问题是“为什么传递给调用的参数和函数内部的this的值不同?”而另一个问题是“为什么代码块1比代码块2更快?”
我的问题的正确答案是“因为您未使用严格模式”,而另一个问题的答案与实现ECMAScript的引擎在内部如何快速访问数据有关。
我希望这个澄清是正确的
.call内部调用[[Call]],执行
- 执行OrdinaryCallBindThis(F,calleeContext,thisArgument)。
并且OrdinaryCallBindThis(设置this要调用的函数的值)将以this非严格模式将新包装在对象中:
如果thisMode是严格的,则让thisValue为thisArgument。
其他,
一种。如果thisArgument未定义或为null,则...
b。否则,让thisValue为!ToObject(thisArgument)。
在严格模式下,您会看到字符串没有被包装在对象中:
'use strict';
(function() {
console.log(this);
console.log(this === 'string literal');
}).call('string literal');Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |