美文网首页我爱编程
JS作用域链搞不懂?不存在的!

JS作用域链搞不懂?不存在的!

作者: 一颗奋发向上的蛋 | 来源:发表于2018-06-09 22:12 被阅读0次

在ES5中,js的作用域不同于别的语言,{}不构成块级作用域,作用域是靠函数形成的。也就是说只有全局作用域和函数作用域,并没有块作用域。
例如:

for(var i = 0; i < 3; i++){
  var j = 4
}
console.log(i)  //3
console.log(j)  //4

再来看作用域链,我的理解,怎么找一个变量是在哪里声明的就是靠的作用域链原理。
记住以下三点基本就可以搞定啦。

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

举个例子:

var a = 1
var b = 2
function sum(a) {
  var b = 3
  console.log(a + b)
}
sum(2) //5

上面的例子显而易见,那如果函数里面找不到变量呢?那么它会在当前函数的词法作用域中去找,及函数声明的作用域中。

// sum函数中没有变量b的声明,所以取全局的
var a = 1
var b = 2
function sum(a) {
  console.log(a + b)
}
sum(2) //4

再来看看下面这个例子

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

最后会输出console.log(a),那么a取值会是fn3中调用fn2的地方找吗,还是fn2声明的作用域中找呢。上文已经有解释,那么结果就是2。

相关文章

  • JS作用域链搞不懂?不存在的!

    在ES5中,js的作用域不同于别的语言,{}不构成块级作用域,作用域是靠函数形成的。也就是说只有全局作用域和函数作...

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

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

  • JS 作用域链、导入导出

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

  • 闭包

    一、理解闭包前js基础1、作用域链(作用域、作用域链中有说)。2、js的内存回收机制。一个函数在执行开始的时候,会...

  • 2018-12-18

    JS高级 作用域&作用域链 作用域: 1.作用域的个数:n(函数声明的个数)+1(全局作用域)2.作用域不会存储变...

  • 作用域和作用链

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

  • 浅谈JS作用域链

    浅谈JS作用域链 作用域 作用域(scope)就是变量访问规则的有效范围。作用域外,无法引用作用域内的变量;离开作...

  • JS进阶系列

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

  • JavaScript 函数闭包(colsure)

    理解闭包,你首先必须理解JS的变量作用域,JavaScript作用域和作用域链。 ES6之前,变量的作用域分为全局...

  • 20-闭包

    来源之所以有闭包是因为js中特殊的作用域。JS中并不存在像其它语言的块级作用域,JS中一个函数就是一个作用域。变量...

网友评论

    本文标题:JS作用域链搞不懂?不存在的!

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