function foobar() {
console.log(this);
}
foobar.call("Hello");
此代码显示:
{ '0': 'H', '1': 'e', '2': 'l', '3': 'l', '4': 'o' }
我在期待"你好"待显示。
为什么呢?以及如何解决这个问题?
答案 0 :(得分:3)
Function#call
(间接)将字符串原语转换为String
对象(请参阅规范的§10.4.3;我们从§15.3.4.4开始到达那里,这将我们带到§13.2.1,它将我们带到§10.4.3)。
你可以用:
强制它console.log(this.toString());
请注意,在严格模式下,它不会转换为String
对象,因为在严格模式下,this
可以是基元(包括基本字符串)。 E.g:
// 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>
答案 1 :(得分:2)
由于thisArg
函数的第一个参数call()
不是null
或undefined
,因此函数体内this
的值等于{{1} }。