**var x = 1
$(document).ready(function(){
alert(x)
})
↑以上输出正常**
var x = 1
$(document).ready(function(){
alert(x)
var x = 2;
alert(x)
})
第一个x为undefined
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这不是作用域的问题,是变量声明提升,sf上类似的问题和文章也有很多。
结果没有任何问题,楼上说的对,这是一个变量声明提升的问题,通过var声明的变量会提升,但是赋值却会按顺序来,第二段那个var a覆盖了全局作用域里的var a=1,在执行第一个alert(a)时,函数里的a被声明了,却没来得及赋值当然就是undefined
变量提升的问题
第二段代码相当于
})
第一个alert的x定义了但是没有值
这样可以看得清楚了吧
就是一个简单的变量提升问题,可以看看这篇文章:
JavaScript变量提升
个人觉得其实这个本质是作用域或者namespace的问题,因为js编译期函数里面对x的赋值就确定了x在函数内部的namespace里面,而alert(x)
的时候,却发现没有赋值,因此就是undifined, 而如果直接alert(x), 没有赋值就不会在函数的namespace里面放入x, 而是去找其它作用域的, 于是找到最外面的x,因此可以输出。