作用域

Javascript 变量作用域

var a=100; 

 

var b=true; 

 

function test(){ 

 

    alert(a); 

   

    alert(b); 

 

    b=false; 

 

    alert(b); 

 

    var a=200; 

 

    alert(a/2); 

 

    alert(++Math.PI); 

 

    alert(Math.PI++); 

 

 

test();

结果为:undefined、true、 false、100、4.141592653589793、 3.141592653589793

 

 

为什么第一个alertundefined,而第二个为true。这问题也可以延伸为——alert(b)时怎么就会找外部的b,alert(a)时就不会往外面找?!

我们都明白局部变量的优先级大于全局变量,或者说内围作用域的变量的优先级比外围的高。当JS引擎在当前作用域找不到此变量时,它就往外围的作用域找。不过,在这之前,有一个严肃的问题是,究竟当前作用域存不存在这个变量。像javascript这样的解释型语言,基本分为两个阶段,编译期(下面为符合大多数语言的称呼习惯,改叫预编译)与运行期。在预编译阶段,它是用函数来划分作用域,然后逐层为其以 var 声明的变量(下略称为var变量)与函数定义开辟内存空间,再然后对var变量进行特殊处理,统统赋初始值为undefined,如下图:

 

由上图,我们便可以推知,当前网页拥有两个a,一个b,一个test函数。如果在运行期用到除此以外的东东,如c函数或d变量啦,就会报未定义错误(用eval等非正常手段生成变量与函数的情况除外),此外,它们最多出现未赋值警告。

javascript的运行期是在为var变量与函数定义分配空间后立即执行,并且是逐行往下执行的。

  • 1行它为外围作用域的a赋值为100
  • 2行它为外围作用域的b赋值为true
  • 3行进行test的作用域,我们简称为内围作用域。
  • 4行就立即调用内围作用域的a,这时它还没有来得及赋值呢!不过它已经声明过了,因此默认为其赋值为undefined(在预编译阶段,见图),于是alertundefined
  • 5行就调用b时,JS引擎就拿起我画的图看了(笑),发现test的作用域内没有b,眼睛往外望,发现b了,而b在第二行就赋值为true,于是alerttrue
  • 6行为一个赋值操作,把外围的b变量改赋为false。于是到第7行时,alertfalse。以下说法不说了。

 

转载于:https://www.cnblogs.com/wuleiku/p/5390438.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值