JavaScript函数作用域中变量的差异

3

我正在阅读有关JavaScript执行上下文和作用域的主题。以下是一段简单的代码:

 var scope="global";  
    function t(){  
        alert(scope);  // alert :"undefined"
        var scope="local" ; 
        alert(scope);  // alert: "local"
    }  
    t();  

如果我去掉 'var scope="local" ;' ,就变成了这个:
var scope="global";  
function t(){  
    alert(scope);  // alert :"global"   
}  
t();  

在函数t()中删除 var scope="local" 后,我不明白为什么第二个例子中scope的值会变为“global”。

有人能帮忙解释一下吗?谢谢!


你明白为什么第一个示例中的第一个“alert”显示为“undefined”吗? - Diego Cardoso
@DiegoCardoso 我其实不太理解,请发一个示例链接好吗? - Rob Scott
2
@RobScott 这是因为变量提升。在函数内定义的任何变量都会被提升到该函数的顶部。所以,在这种情况下,他正在重新定义相同的变量,但在第一行中,“scope”尚未初始化。您可以查看@Tim答案中的链接。 - Diego Cardoso
@Steven Liang,您可以接受一个答案吗? - math2001
4个回答

3
当您执行以下操作时:
scope = 'global'
function t() {
  alert(scope) // undefined
  var scope = 'func'
  alert(scope) // func
}
t()

var scope...这一行,你在告诉JS:注意了,在这个函数中我要定义“scope”。因此,JS会将其值重置为未定义(undefined)。就好像你执行了以下操作:

scope = 'global'
function t() {
  var scope; // erase previous 'scope', so it is now undefined
  alert(scope) // undefined
  scope = 'func'
  alert(scope) // func
}
t()

但如果你只是这样做

scope = 'global'
function t() {
  alert(scope) // global
}
t()

您在函数中没有创建变量scope,因此JS不会擦除它的值,当您尝试访问它时,JS会尝试在更高的位置找到它(在这种情况下是全局命名空间)。

希望您能明白... 这确实有点奇怪,因为首先,JS会查找您在函数中声明的每个变量(并重置/初始化它们),然后才运行您的函数。

Matt


2

在你的第一个例子中,scope的作用域(即函数内部声明的变量)是函数t的整个主体。它直到到达var scope == ...行之前都没有值,但从一开始就已经定义了。

因此,alert(scope)将“scope”解析为本地定义的尚未具有值的变量 - 也就是说,它是undefined

更多解释请参见此问题

关于在JavaScript函数体顶部声明变量的好处。


0
这是由于 JavaScript 中的提升(hoisting)概念。函数 t() 中的变量作用域被提升到函数开头,即它被初始化为 undefined,然后 'local' 被赋值给它。

0
var scope="global";  
function t(){ 
    // you redefine variable scope here
    // so, the global one is not visible.

    alert(scope);  // alert :"undefined"
    alert(window.scope); //alert: "global"
    var scope="local" ; 
    alert(scope);  // alert: "local"
}  
t();  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接