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>