JavaScript';这';快把我逼疯了
在我推进JS学习escalade的过程中,我经常使用它来确定范围、函数调用站点等。最近我遇到了这样一个问题:JavaScript';这';快把我逼疯了,javascript,this,Javascript,This,在我推进JS学习escalade的过程中,我经常使用它来确定范围、函数调用站点等。最近我遇到了这样一个问题: 函数foo(){ console.log(this.a); } var a=2; 功能条(){ var a=5; foo(); }; bar() 1) 为什么结果是2而不是5,因为调用foo的站点位于a为5的酒吧内 在JavaScript中,调用的站点对这个没有任何影响。如何调用函数以及如何定义该函数(例如,它是绑定函数、箭头函数还是仅仅是普通函数或方法)都很重要 2) 为什么pyth
函数foo(){
console.log(this.a);
}
var a=2;
功能条(){
var a=5;
foo();
};
bar()代码>
1) 为什么结果是2而不是5,因为调用foo的站点位于a为5的酒吧内
在JavaScript中,调用的站点对这个
没有任何影响。如何调用函数以及如何定义该函数(例如,它是绑定函数、箭头函数还是仅仅是普通函数或方法)都很重要
2) 为什么pythontutor是flaggin和error
因为在严格模式下,这将是一个错误
当您这样做时:
foo();
…您没有为呼叫设置任何显式此。如果foo
是一个普通函数(而您的是),这意味着在松散模式下,此
将在调用foo
期间引用全局对象,并在this.a
上查看全局对象的a
属性(全局a
的值为2)。在严格模式下,此
将是未定义的
,因此此.a
是一个错误(尝试从未定义的
读取a
)
另外,bar
中的a
局部变量不能作为任何对象的属性访问*
相关的:
*血淋淋的细节:从概念上讲,在规范级别上,它是一个绑定,保存在变量环境记录(概念上是一个对象)中,用于调用bar
(概念上也是一个对象)的执行上下文,但这是概念性的。我们无法从代码中访问环境记录对象或执行上下文对象,并且在给定的实现中,它们可能不存在。@Xufox此
指函数调用期间设置的上下文(显式或隐式)。它与函数的定义位置没有关联。好的,pythontutor必须处于严格模式下。这就是全部。但第一个问题仍然适用。@fernandosares因为var a=5代码>是一个局部变量。局部变量永远无法通过任何对象的属性访问使用。“上下文”是一个对象,而不是整个“范围”。它实际上是一个对象。@Xufox:这个
不涉及作用域,也不涉及函数的定义位置。“是一个普通函数”--“普通”在这里是什么意思?@zerkms:我想我已经通过对比清楚了:不是绑定或箭头。对,我也是这么想的。不幸的是,它没有一个专门的名称:-(@zerkms:是的。我稍微重写了一下,让它更清楚一点。我听过“普通”、“正常”,并且我没有创造性地使用了“函数”
函数”(但这没有真正的意义,因为方法不是用函数声明的,但在这方面是“普通的”……唉!)。