繁体   English   中英

在嵌套函数中使用var来声明一个与parent参数同名的变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM