var a = "hello";
function b ()
{
alert(a);
var a = "world";
alert(a);
}
b(); //为什么第一个alert是undefined
var a = "hello";
function b ()
{
alert(window.a);
var a = "world";
alert(a);
}
b(); //为什么这样子就没问题了呢?
第一段代码中,为什么第一个alert是undefined啊?
第二段代码,为什么加了window后就能弹出hello呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
等价于
原因是 变量声明提升
变量声明无论出现在代码的任何位置,都会在任何代码执行之前处理。
https://developer.mozilla.org/zh-CN/docs...
你可以去了解一下js里的变量声明提升。看懂之后,这个问题应该能够明白了。
js的变量声明提升。即当你用var定义的变量,不管在任何位置,都提前到函数顶端。你的函数1的相当于这个函数:
而第二个函数是
上面几位朋友都说的很好,我再补充几点Javascript高级程序设计中说的。
所以对于函数来说,遇到了变量,会根据作用域链从前往后搜索。可以这样理解,在调用某函数的时候,函数内部的代码成为了其作用域链的前端,然后是外部,全局一定是最后的。
重点是在搜索这里,就是说,在函数内部,遇到一个变量的话,会先从内部进行搜索,没有的话就搜外部(沿着作用域链)。
再看看你那个函数,
alert(a)出现了a变量,好了,开始在函数内部进行搜索,发现a已经声明了,但是却是在这之后定义的"world",所以就是undefined啦。这就是所谓的变量提升。你把后面的声明去掉会发现alert(a)是"hello"。搜索也是有顺序的,例如有参数的话肯定是先从参数开始。
enjoy!
所以第一次alert(a) 为 undefined 而不是 你以为的 全局的 a;这个涉及到的是 js的预编译这个点
类似“预编译”的操作:
首先会创建一个当前执行环境下的活动对象,并将那些用var申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是undefined,并将那些以function定义的函数也添加为活动对象的属性,而他们的值正是函数的定义
也就是说:
多去学习下JS的基础,涉及变量作用域和var 关键字声明变量的预解析
js中不仅有变量提升 还有函数提升,建议楼主都看下
因为JavaScript有变量提前机智,只有执行到赋值的那一行才会初始化!
永远都有人问这个问题,不能正正经经的把JS的书看完么