javaScript问题?全局变量

yybf000 发布于 2012/07/20 18:43
阅读 2K+
收藏 1

var x=1;

function (){

alert(x);

var x=1212;

alert(x);

}

为什么第一个alert(x);提示为Undefined,它不是全局变量么

加载中
1
皮皮蟹
皮皮蟹

关于js的变量作用域,有两点与C++等强类型语言不同。
1、js的变量有两种作用域:全局变量和局部变量。没有使用 var 声明的变量和在function之外声明的变量都是全局变量,是window属性之一;使用 var 声明的变量属于所在函数,不管在函数的哪个位置出现,等价于在函数一开始声明。局部变量比同名全局变量的优先级高,所以局部变量会隐藏同名的全局变量。要想访问被隐藏的全局变量就加上 window. 前缀。
2、js没有块作用域,在语句块之后,在函数结束之前,语句块定义的变量都是可以访问的。比如:for(var idx =0; idx<2;idx++){} alert(idx); 结果显示为2。

1
qq123
qq123
首先这段程序涉及到了以下三个概念 执行环境 变量对象 作用域链 js的执行环境分全局的(浏览器的话就是window执行环境)和function执行环境,变量对象是用来保存执行环境下的变量和方法的,而作用域链上放着一个一个的变量对象形成一个链条。 这段代码的执行过程应该是这样的 首先进入全局执行环境 建立该执行环境下的变量对象A(保存有该执行环境下的x和一个匿名方法),再往下执行到匿名方法的执行环境 建立变量对象B(保存有该执行环境下的x),而js的当前执行环境的变量对象永远放在作用域链的最前端,所在执行第一个alert(x), 就会找当前执行环境的变量对象B是否保存有x, 而事实上是有的,但alert(x)之前没有给x赋值,所出得到的结果就是undefined, 如果变量对象B中不存在x,那么程序就会顺着作用域链找上一个变量对象A里是否有x. 希望对你有帮忙! 在手机上敲的 不知道为什么换行没有效果,就这么看吧
0
32789mm3600
32789mm3600

相当于

var x=1;

function (){

var x;

alert(x);

 x=1212;

alert(x);

}

0
旁边白
旁边白
还是看下编译原理吧。
0
c
collinhu
函数体内重新声明变量X为局部变量,全局变量X 被隐藏掉了。所以第一alert(x)时,为还未被赋值,即 为 Undefined。  
0
猪也有理想
猪也有理想
手机不好打字'勿怪'js有一个域的概念'仅仅只有一个函数域'编译的时候'先查找该域内是否存在'如果不存在'再去window查找是否存在'你第一次查找的时候'在域内已经声明了'只是未被赋直'显示undefined'在第二次已经被赋直'会显示赋得直
0
极品渣子
极品渣子
第一次要this.x
0
FatYU
FatYU
因为有var~
0
铨铨灰
铨铨灰
个人认为
function (){
  alert(x);
  var x=1212;
  alert(x);
}
在执行之前会进行预解析:
会将所有定义的变量初始化为undefined,当执行到相应的位置才进行赋值操作,所以一开始
var x = undefined

0
天空依旧湛蓝
天空依旧湛蓝
我的就显示了第一个值是1,不是undifined,我迷糊了
返回顶部
顶部