js 作用域与作用域链

The more  hard you work The more luck you get

var socpe = "global";

function t(){

   console.log(scope);

   var scope = "local";

   consloe.log(scope);

}

t();

(PS: console.log()是firebug提供的调试工具,很好用,有兴趣的童鞋可以用下,比浏览器+alert好用多了)

第一句输出的是: "undefined",而不是 "global"

第二讲输出的是:"local"

  你可能会认为第一句会输出:"global",因为代码还没执行var scope="local",所以肯定会输出“global"。

  我说这想法完全没错,只不过用错了对象。我们首先要区分Javascript的函数作用域与我们熟知的C/C++等的块级作用域

  在C/C++中,花括号内中的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的。而Javascript压根没有块级作用域,而是函数作用域.

所谓函数作用域就是说:-》变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

所以可以将上面的代码写成:

 var scope = "global";

function t(){

  var scope;

  console.log(scope);

  scope = "local';

  console.log(scope);

}

t();

由于函数作用域的特性,局部变量在整个函数体始终是由定义的, 我们可以将变量声明”提前“到函数体顶部,同时变量初始化还在原来位置。为什么说Js没有块级作用域呢,有以下代码为证:

var name = "global";

if(true){

 var name = "local";

  console.log(name)

}

console.log(name);

都输出是“local",如果有块级作用域,明显if语句将创建局部变量name,并不会修改全局name,可是没有这样,所以Js没有块级作用域。

现在很好理解为什么会得出那样的结果了。scope声明覆盖了全局的scope,但是还没有赋值,所以输出:”undefined“。

所以下面的代码也就很好理解了。


function t(flag){

   if(flag) {

   var s = "ifscope";

  for(var i = 0; i < 2;i++);

 }

console.log(i);

consloe.log(s);

}

t(true);


变量作用域

function t(flag){

   if(flag) {

   s = "ifscope";

  for(var i = 0; i < 2;i++);

 }

console.log(i);

}

t(true);

console.log(s);// ifscope.

因为s 是全局变量而且还是订车对象的属性 所以 console.log(window.s);

当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说无法通过delete运算符删除

var name=1    ->不可删除

sex=”girl“         ->可删除

this.age=22    ->可删除

作用域链

name = "long";

function t(){

   var name = "tlong";

   function s(){

         var name = "slong";

         console.log(name);

  }

 function ss(){

         console.log(name);

 }

s();//slong

ss();//tlong

}

t();

当执行s时,将创建函数s的执行环境(调用对象),并将该对象置于链表开头,然后将函数t的调用对象链接在之后,最后是全局对象。然后从链表开头寻找变量name,很明显

name是"slong"。但执行ss()时,作用域链是: ss()->t()->window,所以name是”tlong"

再看看下面的这个






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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值