如图,js为什么alert出来的是undefined?

<html>
<body>
<script type="text/javascript">
    var amt=100;
    function a(){
        var amt =amt;
        alert(amt)
    }
    a()
</script>

</body>
</html>
阅读 4.4k
6 个回答

——————————————— 神奇的分割线 ———————————————
正解:

因为作用域的关系,你在函数内部又重新声明了一个 `amt`,
所以会优先使用最近作用域的变量,所以 `var amt = amt`,其实是这样的 => `var amt; amt = amt`
内部的 `amt` 赋值给了内部的 `amt` ,根本没用到外面的 `amt`

原答案有误:

不可能吧,amt 是全局变量,肯定能访问到的啊,而且是在函数调用之前就声明好了的

——————————————— 神奇的分割线 ———————————————
提示:请将答案主体放在回答中,而不是评论里
编辑 By:月之领主LM

function a(){
 // var amt = amt; 
      ⬇ ⬇ 等同于
    var amt; 
    amt = amt;
    当然是`undefined`
}

所谓的声明提前,可以理解为引擎预扫描代码,把所有的var声明的变量放到作用域的最上面

function a(){
    var amt = undefined;
    amt = amt;
    alert(amt)
}

这时候访问到的amt自然就是undefined了

声明提升了,它优先取内部的变量的

作用域的问题兄弟,函数内部的作用域并不能够访问到外部的amt变量

已采纳的那个答案虽然正确,但没把具体原理说出来
还是2楼chenqiao说到点子上了,声明提前,也就是var 声明会在域里面最先执行
即使在声明上面获取外域的变量,也不行,比如:
function a(){
console.log(amt); //按照执行顺序,理应该先执行这个
var amt = amt; //但因为这里有个声明 所以这里才是最先执行的
console.log(amt);
}
所以导致执行步骤最终变成:
function a(){
var amt;
amt = amt;
console.log(amt);
console.log(amt);
}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题