Javascript预编译和处理

在javascript中,变量的作用域有全局(window对象)作用域和函数调用作用域。

以下变量具有全局作用域
1. 所有在最外层定义(非函数体内定义)的变量都拥有全局作用域
2. 所有末定义直接赋值的变量,系统会自动声明为拥有全局作用域的变量
3. 所有window对象的属性拥有全局作用域

以下变量具有函数作用域
1. 在函数体内部用var定义的变量,这里要注意一点,只要是在函数里定义的变量,就算是在最后一句定义,该变量也拥有整个函数的作用域

下面看一段代码:

var tt = 'aa';
function test(){
  alert(tt);
  var tt = 'dd';
  alert(tt);
}
test(); 

很多人第一反映认为输出结果是: aa   dd  (XXXXX)

经过测试后我们会发现结果是:undefind dd

为什么会产生这样的结果,这是因为javascript预编译和处理,var申明的变量进行了预编译,赋值操作未执行

所以先输出undefined,不会报错或者输出全局变量tt的值

还有一个经典的例子:

var a = 10;
  function test() {
    a = 100;
    alert(a);
    alert(this.a);//相当于window.a,调用的是全局变量
    var a;
    alert(a);
  }
 test();

相当于:

var a = 10;
function test() {	
   var a;
   a = 100;
   alert(a);//调用的是局部变量a 
   alert(this.a);//相当于window.a,调用的是全局变量 
   alert(a);//调用的是局部变量a 
} 
test();

产生的结果是:100    10   100

从上面两个例子,我们可以清楚的认识到:

一个函数被定义的时候,自带的变量属性会被预编译

当被执行的时候,首先创建函数自定义的变量(如 var a; 无论a在函数哪个地方定义,函数执行时会首先被创建,值为undifined)
函数引用到一个变量的时候,会循着变量属性查找,如果自身有定义,则不访问全局变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值