美文网首页
关于JS中的作用域链

关于JS中的作用域链

作者: 醉月梦仙 | 来源:发表于2018-08-14 00:54 被阅读0次

1. 全局变量与局部变量

全局变量:定义在函数外部的变量可以被叫做全局变量
局部变量:定义在函数内部的变量,但是如果变量在函数内部没有使用var来声明,那么该变量也会被认为是全局变量。
1,全局变量对应的作用域是整个代码,即在代码的任何部分都是可以调用该变量的
2,局部变量对应的作用域是函数内部,只能在函数内部使用,如果在函数外部使用就会出错
3,局部变量的优先级大于全局变量,即如果全局变量和局部变量名字一样,那么在函数内部局部变量会覆盖掉全局变量。

2. 作用域链(scope chain)

全局作用域和局部作用域中变量的访问权限,其实是由作用域链决定的。

每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链。作用域链是函数被创建的作用域中对象的集合。作用域链可以保证对执行环境有权访问的所有变量和函数的有序访问。

作用域链的最前端始终是当前执行的代码所在环境的变量对象(如果该环境是函数,则将其活动对象作为变量对象),下一个变量对象来自包含环境(包含当前还行环境的环境),下一个变量对象来自包含环境的包含环境,依次往上,直到全局执行环境的变量对象。全局执行环境的变量对象始终是作用域链中的最后一个对象。

标识符解析是沿着作用域一级一级的向上搜索标识符的过程。搜索过程始终是从作用域的前端逐地向后回溯,直到找到标识符(找不到,就会导致错误发生)。

从下面一个例子来看

var a = 1
function fn1(){
  function fn2(){
    console.log(a);
  }
  var a = 4;
  fn2();
}
fn1() //输出多少

根据上方作用域链的概念可以知道,fn2中并没有定义a,那么就会向上一级作用域寻找,这里的上一级作用域具体指的是函数声明的作用域,在上一级作用域中,变量a=4,因此最后输出为4

再看另外一个例子

var a = 1
function fn1(){
  function fn2(){
    console.log(a);
  }
  fn2();
  var a = 4
}
fn1() //输出多少

和上一个例子稍有不同的是,在fn1内部先执行了fn2,再声明a=4,而这一次并没有和上一个例子一样输出4,而是会输出undefined。这是因为在函数内部的作用域下,同样会适用变量提升的概念。fn1的内部相当于

  function fn2(){
    console.log(a);
  }
  var a;
  fn2();
  a = 4;

这样不难看出,结果会输出undefined.

总结

  1. 函数在执行的过程中,先从自己内部找变量
  2. 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
  3. 注意找的是变量的当前的状态(适用变量提升)

相关文章

  • 干货!月薪80k前端大佬面试笔记:JS闭包解析!

    三点注意事项 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域)。 JS中的作用域链,内部的作用域可以访...

  • 作用域和作用链

    关键词:作用域作用链 作用域 js中没有块级作用域 全局作用域,函数作用域太简单,就不演示(≧▽≦)/啦啦啦 作用...

  • 作用域链&闭包&函数相关

    作用域链 在JS中函数可以创建作用域; 函数中又可以创建函数(可以开辟新的作用域); 函数内部的作用域可以访问外部...

  • JS进阶系列

    在JS入门难点解析系列中,我们对JS的一些重要概念,比如:作用域,作用域链,原型,原型链,继承,活动对象,this...

  • 关于JS中的作用域链

    1. 全局变量与局部变量 全局变量:定义在函数外部的变量可以被叫做全局变量局部变量:定义在函数内部的变量,但是如果...

  • 关于js中的作用域链

    全局作用域 在页面上直接声明一个变量 输出结果为1全局作用域相当于页面上有一个windowa 是window中的一...

  • 关于js中的作用域链

    一个变量的作用域(scope)是程序源代码中定义这个变量的区域。简单的说,作用域就是变量与函数的可访问范围。全局变...

  • JS 作用域链、导入导出

    1. JS 的作用域链 作用域在 JS 中表示变量的可访问性和可见性。JS 作用域有 3 种:1. 全局作用域;2...

  • JS高级-闭包、沙箱

    作用域,作用域链,预解析 变量:局部变量、全局变量 作用域:变量的使用范围 js中没有块级作用域,一对括号中定义的...

  • js中作用域与作用域链

    js中作用域与作用域链 作用域 *作用域基本概念 作用域一般指变量的作用范围,变量分为全局变量和局部变量,对应的作...

网友评论

      本文标题:关于JS中的作用域链

      本文链接:https://www.haomeiwen.com/subject/nkopbftx.html