美文网首页
作用域与作用域链

作用域与作用域链

作者: 原上的小木屋 | 来源:发表于2018-12-08 12:37 被阅读0次

原理

  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() //输出多少
  • 首先进入fn1作用域,发现返回值为fn3,在当前作用域即fn1下查找fn3
  • 进入fn3,发现调用了fn2,在当前作用域即fn3下查找fn2,未找到,返回上一级找到fn2
  • 进入fn2,执行console.log(a),未找到a,返回上一级找到定义了变量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() //输出多少
  • 首先进入fn1作用域,发现返回值为fn3,在当前作用域即fn1下查找fn3
  • 进入fn3,发现调用了fn2,在当前作用域即fn3下查找fn2,未找到,返回上一级找到fn2
  • 进入fn2,执行console.log(a),未找到a,返回上一级找到定义了变量a为1,输出1
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() //输出多少
  • 首先进入fn1作用域,发现返回值为fn3,在当前作用域即fn1下查找fn3
  • 进入fn3,发现调用了fn2,在当前作用域即fn3下查找fn2
  • 进入fn2,执行console.log(a),未找到a,返回上一级而此时就涉及到预执行的操作,JS会默认运行操作是从上而下,首先找到的是var a,而此时的a的值只被声明,未被赋值,为undefined,所以最终输出为undefined。

相关文章

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • JavaScript 作用域链与闭包

    作用域链与闭包 了解作用域链之前需要先了解下作用域是什么。 作用域 几乎所有的语言都有作用域的概念。这是因为它们都...

  • JavaScript核心技术开发解密读书笔记(第五章)

    第五章 作用域与作用域链 1. 作用域 常见的作用域有两种,全局作用域和函数作用域。ES6中新增了块级作用域。全局...

  • 作用域和作用域链

    作用域和作用域链 作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在Java...

  • web性能实践

    一. 作用域 前面我们了解作用域概念的以及作用域链是如何运作的。 随着作用域链中的作用域数量的增加,访问当前作用域...

  • JavaScript系列——作用域链

    作用域与作用域链 首先,什么是作用域?先看看 MDN文档的定义: The current context of e...

  • JavaScript函数的执行-作用域链、执行上下文、闭包

    1、作用域与作用域链 作用域 作用域是指程序源代码中定义变量的区域。 作用域规定了如何查找变量,也就是确定当前执行...

  • js中作用域与作用域链

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

  • 作用域链

    作用域链 把多个作用域串起来便形成了作用域链;每个函数在初始化完成之后就拥有了各自的作用域链,但此时的作用域链中并...

  • 作用域/作用域链 闭包及其使用

    一、作用域、作用域链 作用域(scope) 浅显的理解: 作用域就是变量的可用范围(scope) 为什么要有作用域...

网友评论

      本文标题:作用域与作用域链

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