【问题标题】:Function's scope of variables函数的变量范围
【发布时间】:2013-04-17 16:05:22
【问题描述】:

我执行这样的功能:

var a = 123;
function f() { 
  alert(a);
  var a = 9;
} 
f();

结果是undefined,为什么会这样?为什么不是123

【问题讨论】:

标签: javascript function scope


【解决方案1】:

你的函数实际上编译为:

function f() {
  var a; 
  alert(a);
  a = 9;
} 

因为变量提升:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var#var_hoisting

因此,您的函数将a 重新声明为局部变量,其值为undefinedalerts,然后将其值重新设置为9

alert的时候,因为提升,它的值为undefined

【讨论】:

  • 但是如果我删除var a = 9;,警报可以正确显示123,为什么它没有重新声明a
  • @hh54188 如果你删除了var a = 9;,那么就没有重新声明......你删除了它......你的所有功能都是alert(a);。于是它查找作用域链,发现全局作用域中的a123,所以它的求值为123
  • 但是重新声明是在alert之后发生的,所以这意味着变量声明与执行顺序无关?
  • @hh54188 是的,但是如果您阅读我的回答,它会说明变量声明是 hoisted(也请阅读我提供的网站链接)。从技术上讲,由于提升,您的功能在技术上作为我在答案中包含的功能执行。所以a在技术上在函数的开头重新定义(在alert之前)
【解决方案2】:

如果您再次在函数语法中声明a,它将成为一个新变量。如果您想使用之前的值 123,那么您不应该包含 var a = 9 语句,因为它会创建一个新变量。 这可以详细解释: What is the scope of variables in JavaScript?

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2012-10-04
    • 2016-10-26
    • 2015-08-25
    相关资源
    最近更新 更多