[英]Why can't use let to declare a variable using the same name as one function parameter, even the parameter get set default value?
[英]Using var in a nested function to declare a variable with the same name as a parameter of parent
我正在使用JavaScript编写一些代码并发现了一个意外的行为。
我在f
里面使用嵌套函数g
。 f
有一个名为m
的参数。 当在g
使用和声明一个具有相同名称的变量时,会发生一些奇怪的事情:
var f = function(m) {
var g = function() {
alert(m);
var m = 0;
};
g();
};
f(1);
这段代码将导致undefined
,而不是我期望的1
。
在var
行下面移动alert
语句将导致答案0
有意义。
我想这是因为JavaScript只使用函数作为名称闭包, var m
将通过声明附加到函数g
,但是在alert
时尚未分配m
。
但我不确定这一点,因为如果函数没有嵌套,那么行为对我来说很好看:
var g = function(m) {
alert(m);
var m = 0;
};
g(1);
会产生1
。
谁能解释一下? 谢谢。
Javascript使用函数范围,这意味着变量的范围不像C的块范围根据{}
进入和超出范围,而是由函数的开头和结尾进入和超出范围。 因此,您在函数中定义的每个局部变量都是从该函数的执行开始声明的,并且在您在函数中初始化之前将是undefined
类型。
因此,当g
执行时,由于它将在某个时刻创建局部变量m
,运行时已经声明存在一个局部m
(显然隐藏了f
函数的外部m),其类型是从g
'的开头 undefined
的执行
请参阅https://developer.mozilla.org/en/JavaScript/Reference/Scope_Cheatsheet ,它解释了当您执行var varName
它将变量提升到函数范围的顶部。 该页面有很多很好的例子,这里有一个总结它的引用:
变量的每个定义实际上都是其范围顶部的变量声明 ,以及定义所在位置的赋值 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.