Javascript作用域的问题

来源:互联网 发布:linux ln 文件夹 编辑:程序博客网 时间:2024/05/10 09:53

Javascript作用域的问题

发布:dxy 字体:[增加 减小] 类型:转载
在说这个话题之前,我想先说几句题外话:最近偶然碰到有朋友问我“hoisting”的问题。即在js里所有变量的声明都是置顶的,而赋值则是在之后发生的。
可以看看这个例子: 
复制代码代码如下:

var a = 'global'; 
(function () { 
alert(a); 
var a = 'local'; 
})(); 


  大家第一眼看到这个例子觉得输出结果是什么?‘global'?还是‘local'?其实都不是,输出的是undefined,不用迷惑,我的题外话就是为了讲这个东西的。 
其实很简单,看一看JavaScript运行机制就会明白。我们可以把这种现象看做“预声明”。但是如果稍微深究一下,会明白得更透彻。 
  这里其实涉及到对象属性绑定机制。因为所有JavaScript函数都是一个对象。在函数里声明的变量可以看做这个对象的“类似属性”。对象属性的绑定在语言里是有分“早绑定”和“晚绑定”之分的。 

  【早绑定】 
是指在实例化对象之前定义其属性和方法。解析程序时可以提前转换为机器代码。通常的强类型语言如C++,java等,都是早绑定机制的。而JavaScript不是强类型语言。它使用的是“晚绑定”机制。 
  【晚绑定】 
是指在程序运行前,无需检查对象类型,只要检查对象是否支持特性和方法即可。可以在绑定前对对象执行大量操作而不受任何惩罚。 
上面代码出现的“预声明”现象,我们大可用“晚绑定”机制来解释。在函数的作用域中,所有变量都是“晚绑定”的。 即声明是顶级的。所以上面的代码和下面的一致: 
复制代码代码如下:

var a = 'global'; 
(function () { 
var a; 
alert(a); 
a = 'local'; 
})(); 

在alert(a)之前只对a作了声明而没有赋值。所以结果可想而知。 

你说这坑爹不坑爹????什么人设计的啊?真是的。。。不知道为什么这么设计?
原创粉丝点击