function foobar() {
    console.log(this);
}

foobar.call("Hello");


此代码显示:

{ '0': 'H', '1': 'e', '2': 'l', '3': 'l', '4': 'o' }


我期望显示“ Hello”。

为什么?以及如何补救?

最佳答案

Function#call(间接地)将字符串原语转换为String对象(请参见规范的§10.4.3;我们从§15.3.4.4开始,到达§13.2.1,然后进入
您可以使用以下命令将其强制退回:

console.log(this.toString());


请注意,在严格模式下,不会将其转换为String对象,因为在严格模式下,this可以是原始类型(包括原始字符串)。例如。:



// Here, it gets converted to an object
function foo() {
  snippet.log(typeof this); // "object"
}
foo.call("Hello");

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>





但是,如果我们使用严格模式:



// Strict mode
"use strict";

// Here, it remains a primitive
function foo() {
  snippet.log(typeof this); // "string"
}
foo.call("Hello");

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

10-05 20:47
查看更多