我正在使用JavaScript编写一些代码并发现了意外行为。
我在g
内使用嵌套函数f
。 f
有一个名为m
的参数。当在g
内使用和声明一个具有相同名称的变量时,会发生一些奇怪的事情:
var f = function(m) {
var g = function() {
alert(m);
var m = 0;
};
g();
};
f(1);
此代码将生成undefined
,而不是我期望的1
。
将alert
语句移到var
行下面会得到答案0
,这是有道理的。
我想这是因为JavaScript只使用函数作为名称闭包,var m
将使用声明附加到函数g
,但是m
尚未分配alert
。
但我不确定这一点,因为如果函数没有嵌套,那么行为对我来说很好看:
var g = function(m) {
alert(m);
var m = 0;
};
g(1);
会产生1
。
有人可以解释一下吗?谢谢。
答案 0 :(得分:8)
Javascript使用函数范围,这意味着变量的范围不像C的块范围根据{}
进入和超出范围,而是对象进入和超出范围的函数的开头和结尾。因此,您在函数中定义的每个局部变量都是从该函数执行开始时声明的,并且在您在函数中初始化之前将为undefined
类型。
因此,当 请参阅https://developer.mozilla.org/en/JavaScript/Reference/Scope_Cheatsheet,其中解释了当您执行 变量的每个定义实际上是其范围顶部的变量的声明,的赋值定义的地方。g
执行时,由于它将在某个时刻创建局部变量m
,运行时已经声明存在本地m
(显然隐藏了外部f
执行1>} 的undefined
的g
函数的m
var varName
时,它将变量提升到函数范围的顶部。那个页面有很多很好的例子,这里有一个总结它的引用: