我经常使用Visualize来确定范围,函数调用网站等等,同时我推进了我的JS学习升级版。最近我碰到了这个:
function foo() {
console.log( this.a );
}
var a = 2;
function bar() {
var a = 5;
foo();
};
bar();

Google Chrome在控制台中为我提供了2,而我期待5(foo
的通话网站)。有趣的是,pythongtutor(当然在JS下)给了我一个未定义的错误信息,如下所示:
我有两个问题:
答案 0 :(得分:5)
1)为什么结果是2而不是5,因为foo的调用网站是在a为5的bar内。
调用的网站对JavaScript中的this
无效。 如何调用函数以及如何定义函数(例如,它是绑定函数,箭头函数,还是只是简单的函数或方法)都是重要的。
2)为什么pythontutor flaggin和错误?
因为在严格模式下,这将是一个错误。
当你这样做时:
foo();
...您没有为通话设置任何明确的this
。如果foo
是一个普通函数(你的是),这意味着在松散模式下,this
将在调用foo
期间引用全局对象,并查看全局对象&# 39; a
上的this.a
属性(全局a
的值为2)。在严格模式下,this
将为undefined
,因此this.a
是错误的(尝试从a
阅读undefined
)。
另外,a
中的bar
局部变量不能作为任何对象的属性进行访问。*
相关:
* Gory细节:从概念上讲,在规范级别,它是在bar
(也称为对象)调用的执行上下文中的变量环境记录(理论上是一个对象)中保存的绑定,但这是概念性的。我们无法从代码中访问环境记录对象或执行上下文对象,并且在给定的实现中,它们可能并不存在。