JS作用链域

原理:

1、函数在执行时先从自己内部的局部作用域中查找变量
2、如果在函数内部找不到,则在定义此函数的作用域中查找变量
3、依次往上,直至全局作用域,如果在全局作用域中依然找不到,则报错

原理看着抽象,让我们通过几个例子来加深下了解:

例1:
var a = 1
function fn1(){
  function fn2(){
    console.log(a)
  }
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //输出多少

调用过程:调用fn()=>fn1(),fn1()返回fn3,调用fn3,fn3中调用了fn2,输出2。
分析:fn2中没有a变量,fn2被定义在fn1中,获得fn1中的变量a=2

例2:
var a = 1
function fn1(){
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
function fn2(){
  console.log(a)
}
var fn = fn1()
fn() //输出多少

调用过程:fn()=>fn1()=>fn3()=>fn2()=>consolo.log(a)=>输出
分析:fn2中没有a变量,在fn1作用域中寻找,任没有,在全局作用域寻找,输出1

例3:
var a = 1
function fn1(){

  function fn3(){
    function fn2(){
      console.log(a)
    }
    var a

    fn2()
    a = 4
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //输出多少

调用过程:fn()=>fn1()=>fn3()=>fn2()=>console.log(a)=>输出undefined
分析: fn2内部没有a变量,fn3中寻找,var a已经定义,但未赋值,所以输出undefined

总结:作用域链不难,先找局部变量,再往定义该函数的作用域寻找变量,直到全局作用域即可。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原理: 1、函数在执行时先从自己内部的局部作用域中查找变量2、如果在函数内部找不到,则在定义此函数的作用域中查找变...
    春饼sama阅读 450评论 0 0
  • 以前理解的作用链域 函数在执行的过程中,首先从自身的函数作用域找变量; 如果从自身内部找不到变量,就向上一层寻找变...
    饥人谷_momo阅读 821评论 0 0
  • 1. 作用域 JS中的变量和函数并不总是可用的,有其使用的范围,这就是作用域。 JS的作用域靠函数形成,函数内声明...
    饥人谷_张晓霞阅读 455评论 0 0
  • JavaScript是基于词法作用域的语言:通过阅读包含变量定义在内的数行源码就能知道变量的作用域。作用域:即变量...
    PingerL阅读 118评论 0 0
  • 第 1 题 立即执行函数表达式是什么?有什么作用? 1. 立即执行函数是什么 立即执行函数就是 声明一个匿名函数 ...
    红豆丁244阅读 407评论 0 0