我不明白为什么var
变量可以在函数内重新分配,但该更改也适用于函数外。为什么/如何?
var c = 1;
function Fn() {
c = 2;
}
Fn();
c; // 2
为什么值2
不限于函数的范围?当我在一个函数中写c = 2
时,javascript引擎是否会自动在函数之外提升一个新的var c
,并将其赋值为undefined
,然后在调用Fn()
后将其更改为2
?
它适用于函数外部,因为在函数内部,您正在更改变量.
你是不是创建一个只存在于函数内部的新变量。
为什么值2不限于函数的作用域?
您没有使用var
,let
,const
或任何其他方法在函数范围内创建变量。
你正在访问你已经在更大范围内创建的变量。
当我在一个函数内写c = 2时,javascript引擎是否会自动在函数外提升一个新的var c并为其分配未定义的值,然后在调用Fn()时将其更改为2 ?
。没有新的变量。只有您已经在函数外部创建的c
。
这是对javascript最常见的抱怨。既然你用了"变量"它有一个全局作用域,所以即使你在一个新的函数中,当你使用c=2
,因为它已经被全局定义,它是全局改变。使用"Let"帮助定义函数和"构造"的局部内容;将全局变量定义为常量,因此它们不能被更改。当您在不同的JavaScript文件中有两个具有相同名称的全局变量,然后在页面上引用这两个文件时,这个问题特别有趣。全局变量应该谨慎使用。
当你开始运行这个程序时,引擎将存储你用"var"声明的变量。关键字in全局对象(窗口)然后进入函数,引擎将为函数创建特殊作用域,称为"函数执行上下文";(FEC)函数中的每个声明将在这个作用域中可用(FEC),所以当引擎执行你的函数体时会发现重新赋值for变量名为"c">,它将在当前作用域中查找,如果没有找到,它将移动到父作用域,在这种情况下,全局作用域是它的目标,它将找到搜索的变量,然后用新值重新赋值。
阅读这篇精彩的文章->execution-context-how-javascript-works-behind-the-scenes