**var x = 1
$(document).ready(function(){
alert(x)
})
↑以上输出正常**
var x = 1
$(document).ready(function(){
alert(x)
var x = 2;
alert(x)
})
第一个x为undefined
**var x = 1
$(document).ready(function(){
alert(x)
})
↑以上输出正常**
var x = 1
$(document).ready(function(){
alert(x)
var x = 2;
alert(x)
})
第一个x为undefined
结果没有任何问题,楼上说的对,这是一个变量声明提升的问题,通过var声明的变量会提升,但是赋值却会按顺序来,第二段那个var a覆盖了全局作用域里的var a=1,在执行第一个alert(a)时,函数里的a被声明了,却没来得及赋值当然就是undefined
变量提升的问题
第二段代码相当于
var x=1;
$(document).ready(function(){
var x;
alert(x);
x = 2;
alert(x)
})
第一个alert的x定义了但是没有值
这样可以看得清楚了吧
个人觉得其实这个本质是作用域或者namespace的问题,因为js编译期函数里面对x的赋值就确定了x在函数内部的namespace里面,而alert(x)
的时候,却发现没有赋值,因此就是undifined, 而如果直接alert(x), 没有赋值就不会在函数的namespace里面放入x, 而是去找其它作用域的, 于是找到最外面的x,因此可以输出。
27 回答13.1k 阅读
8 回答3.5k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
5 回答5.3k 阅读✓ 已解决
4 回答1.6k 阅读✓ 已解决
3 回答1.7k 阅读
4 回答2.3k 阅读✓ 已解决
这不是作用域的问题,是变量声明提升,sf上类似的问题和文章也有很多。