JavaScript'这个'使我抓狂

时间:2017-10-28 11:09:02

标签: javascript this

我经常使用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下)给了我一个未定义的错误信息,如下所示:

pytontutor after executing code

我有两个问题:

  1. 为什么结果是2而不是5,因为foo的调用网站位于a为5的bar内。
  2. 为什么pythontutor会出现标记错误?

1 个答案:

答案 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(也称为对象)调用的执行上下文中的变量环境记录(理论上是一个对象)中保存的绑定,但这是概念性的。我们无法从代码中访问环境记录对象或执行上下文对象,并且在给定的实现中,它们可能并不存在。