关于作用域链的一些范例

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

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

范例

例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()  //输出多少
分析:

先执行 var a=1,var fn=fn1(),进入function fn1(),执行var a=2,return fn3,进入function fn3(),执行var a =4,fn2(),进入function fn2(),执行console.log(a),由于本作用域没有a,因此向上一级作用域寻找a,即var a=2,因此输出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()  //输出多少
分析:

执行var a=1,var fn=fn1(),进入function fn1(),执行var a=2,return fn3,执行function fn3(),执行var a=4,fn2(),执行function fn2(),执行console.log(a),此作用域没有a,所以向上一级作用域寻找a,即最外层的var a=1,因此输出结果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()
分析:

先执行var a=1,var fn=fn1(),进入function fn1(),执行 var a=2 , return fn3,进入function fn3(),由于fn2()在var a=4之前,但var a会被前置,执行var a,在执行fn2(),进入function fn2(),执行console.log(a),这个时候该作用域没有a,去上一层作用域找a,找到var a,但此时的a还没有赋值,因此输出undefined。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.函数声明和函数表达式有什么区别 (*) 区别: 函数声明后面的分号可加可不加,不加也不影响接下来语句的执行,但...
    Sheldon_Yee阅读 3,089评论 0 1
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 6,375评论 1 10
  • 一、作用域 A、定义 代码在运行时,各个变量、函数和对象的可访问性。换句话说,作用域决定了你的代码里的变量和其他资...
    5吖阅读 3,914评论 0 1
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,383评论 2 17
  • 1,函数声明和函数表达式有什么区别 1、背景介绍 定义函数的方法主要有三种: 1:函数声明(Function De...
    进击的前端_风笑影阅读 3,192评论 0 0