使用字符串作为函数调用范围

时间:2014-12-10 09:42:40

标签: javascript string function scope

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

foobar.call("Hello");

此代码显示:

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

我在期待"你好"待显示。

为什么呢?以及如何解决这个问题?

2 个答案:

答案 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()不是nullundefined,因此函数体内this的值等于{{1} }。

call function description.

中查看更多内容