使用字符串作为函数调用范围
Use a string as a function call scope
function foobar() {
console.log(this);
}
foobar.call("Hello");
此代码显示:
{ '0': 'H', '1': 'e', '2': 'l', '3': 'l', '4': 'o' }
我期待显示"你好"。
为什么?以及如何补救?
Function#call
(间接地)将字符串原语转换为String
对象(参见规范的§10.4.3;我们从§15.3.4.4开始,它把我们带到§13.2.1,这将我们带到§10.4.3)。
您可以通过以下方式强制将其恢复:
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>
由于call()
函数的第一个参数thisArg
不是null
或undefined
所以函数体内this
的值等于Object(thisArg)
。
在调用函数说明中查看更多内容。
相关文章:
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 如何在Javascript函数调用中循环变量
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何远程检查JavaScript应用程序的函数调用堆栈
- javascript函数调用不起作用
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 如何通过函数调用设置图像的src
- 从全局函数调用Ember控制器上的方法
- 为什么Jquery$.ajax在函数调用中触发所有statusCode,即使调用成功
- JavaScript函数调用(arg1)(arg2)
- 为什么更改范围获胜'不能在ng if内部工作,而是通过函数调用AngularJS
- 使用字符串作为函数调用范围
- 有没有办法在函数中重新分配参数,并让它也影响调用范围
- 在 Angular 指令中的事件处理程序中调用范围函数
- JSLint声称某些递归函数调用是“;超出范围”;
- 从指令生成的html中调用范围内的函数
- Javascript函数调用范围
- 使用SweetAlert.js在单独的javascript代码中调用函数.不同范围的麻烦
- 调用angularjs指令函数的范围问题