js高级知识---作用域链

转载 2015年11月19日 16:43:58

一直有想法去写写js方面的东西,我个人是最喜欢js这门语言,喜欢的他的自由和强大,虽然作为脚本语言有很多限制的地方,但也不失为一个好的语言,尤其是在H5出现之后。下面开始说说js的方面的东西,由于自己的能力有现,有点地方说的不明白,还请高手指点。这个文章,如果有时间的话应该会写一个系列,包括js的高级方面的知识,最终希望能够说到js的引擎方面的东西。千里之行,始于足下,下面开始说说最简单的一个东西—js的作用域链,时常也比较容易弄错,也算是自己做一个纪录。

首先看一段代码:

复制代码
 function t(){
          var b=1;
          if(b===1){
              var name="test1";
          }else{
              var name="test2";
          }
          console.log(name);
      }
      t();
复制代码

这段代码,可能很多人认为输出的结果是undefine,但是输出的结果是:

可能有点想不明白,如果是在强类型里面这个肯定是要报错的,但是在js的词法分析和运行中确能运算出来结果,这个是原因是什么呢?原来是js中的作用域是和C++/C中的不一样,js中没有块级作用域,作用域只有函数,只要在一个函数里面,你定义的变量在函数的内部任何地方都可以访问到,包括嵌套的函数。用官方的话说是所谓的函数作用域。所以上面的结果就是一个有值的数据,而不是一个undefine.

再看代码修改:

复制代码
function t() {
    var sp = "test1";
    if (true) {
        var sp = "test2";
        console.log(sp);
    }
    console.log(sp);
}
t();
复制代码

这次输出的结果应该很简单了,只要是在函数内部的块级作用域有js里面都不起作用,所以代码可以拆解成:

 

复制代码
 function t() {
    var sp = "test1";
    // if (true) {
    var sp = "test2";
    console.log(sp);
    // }
    console.log(sp);
}
t();
复制代码

 

所以再次输出都是test2;

 

好了,现在应该是初步了解了js的函数作用域了,这个理解清楚了,作用域链自然也就不攻自破。下面看一个简单的代码:

复制代码
var _name = "windows";
function t() {
    var name = "test1";
    function t1() {
        console.log(_name);//1
        console.log(name);//2
    }
    t1();
    console.log(_name);//3
    console.log(name);//4
}
t();
复制代码

如果上面的问题都清楚的话,这个代码应该很简单,因为js是函数的作用域,所以在函数内数据都有能访问,执行顺序如下:

1、在1中,执行console.log(_name);这个_name在当前的函数内没有,到t函数中去寻找,t函数中也没有就会到windows里面去找,找到_name并输出windows,同理2步骤输出”test1”

234 步骤也是同样的道理,所以结果是

从上面的例子可以看出js作用域特点:1、没有块级的作用域,在一个函数的内部定义都有效 2、如果当前数据在当前的函数里面的没有话,会沿着层级向上找。 

t1->t->window,从而形成作用域链。

相关文章推荐

前端高质量知识(四)-JS详细图解作用域链与闭包

攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路。而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战。 闭包有多重要?如果你是初入前...

《js高级程序设计》学习笔记--4.变量、作用域和内存问题

4.1基本类型和引用类型的值 /*

js变量作用域

  • 2012年08月28日 11:49
  • 44KB
  • 下载

《JavaScript高级程序设计 第三版》学习笔记 (二)执行环境与作用域链

一、值和引用 1.基础类型值:js中五个基础类型unsigned、null、number、boolean、string,这些类型的变量名代表值;把这些变量当作参数传递给函数,解析器会复制一份形参给函...

js基础之作用域

  • 2017年11月06日 09:41
  • 6KB
  • 下载

JS高级程序设计第四章笔记作用域&作用域链

全局执行环境就是最外面的一个执行环境,即window对象; 执行环境(作用域):简单理解就是变量或者函数能够起作用的区域,出了这个区域就不能用,这个环境内代码执行完毕后,环境被销毁,内存被回收,其中...

JS执行环境及作用域链

一、执行环境的定义  执行环境也称环境,是javascript中最为重要的一个概念。执行环境定义了变量或者函数有权访问的其他数据,决定了它们的各自的行为。每个执行环境都有一个与之相关联的变量对象,环境...

JS 之 (三)作用域链、闭包、面向对象

作用域链定义变量在当前环境now、内部环境f1、内部深层环境f2/f3….都起作用的现象形成了一个链条,这个链条就称为变量的”作用域链” var title = '链条'; //...
  • znyyjk
  • znyyjk
  • 2016年09月12日 20:20
  • 195

JS作用域、链学习笔记

JS作用域作用域就是变量与函数的可访问范围,控制着变量与函数的可见性和生命周期。分为全局和局部作用域链。 全局作用域(Global Scope) (1)最外层函数和在最外层函数外面定义的变量拥有全局...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js高级知识---作用域链
举报原因:
原因补充:

(最多只允许输入30个字)