Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript';这';快把我逼疯了_Javascript_This - Fatal编程技术网

JavaScript';这';快把我逼疯了

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

在我推进JS学习escalade的过程中,我经常使用它来确定范围、函数调用站点等。最近我遇到了这样一个问题:

函数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:是的。我稍微重写了一下,让它更清楚一点。我听过“普通”、“正常”,并且我没有创造性地使用了“
函数”
函数”(但这没有真正的意义,因为方法不是用
函数声明的,但在这方面是“普通的”……唉!)。