前端笔记饥人谷技术博客

理解作用链;

2018-03-18  本文已影响17人  好奇男孩

理解作用链的作用

1.函数在执行的过程中,先从自己内部找变量

2.如果找不到,再从创建当前函数所在的作用域去找, 以此往上

3.注意找的是变量的当前的状态

范例

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() //2

最后执行fn2函数,fn2找不到变量a,接着往上在找到创建当前fn2所在的作用域fn1中找到a=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() //1

同上

var a = 1
function fn1(){

  function fn3(){
    function fn2(){
      console.log(a)
    }
    fn2()
    var a = 4
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //undefined

函数fn2在执行的过程中,先从自己内部找变量找不到,再从创建当前函数所在的作用域fn去找,注意此时变量声明前置,a已声明但未初始化为undefined;

理解作用链的原理:

前提:了解全局作用域,函数作用域,变量和函数的声明前置等基础;

函数的生命周期

函数的的生命周期分为创建和执行两个阶段。

变量对象(Variable Object)

VO是一个与执行上下文相关的特殊对象,它存储着在上下文中声明的以下内容:

function add(a,b){
    var sum = a + b;
    function say(){
        alert(sum);
    }
    return sum;
}
// sum,say,a,b 组合的对象就是VO

AO(活动对象)

该对象包含了:

unction add(a,b){
    var sum = a + b;
    function say(){
        alert(sum);
    }
    return sum;
}

add(4,5);
//  我用JS对象来表示AO
//  AO = {
//      this : window,
//      arguments : [4,5],
//      a : 4,
//      b : 5,
//      say : ,
//      sum : undefined
//  }

作用域链

举例:


6.png

1 预处理后,进入全局上下文

7.png

2 执行bar()函数

8.png

3 查找变量

9.png

4 执行foo()函数

10.png

作者:彭荣辉
链接:https://www.jianshu.com/u/0f804364a8a8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读