简单说说Javascript中的作用域链

    Javascript中作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。变量的作用域有全局作用域局部作用域两种。当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链

看几个题目:

A :

 1 var a = 1
 2 function fn1(){
 3   function fn2(){
 4     console.log(a)
 5   }
 6   function fn3(){
 7     var a = 4
 8     fn2()
 9   }
10   var a = 2
11   return fn3
12 }
13 var fn = fn1()
14 fn() //输出多少

观察代码,我们发现在这里  fn() 的结果最终由   function fn2(){console.log(a)} 决定,执行fn2,但在其中没有声明a,于是在其上一级作用域中寻找,发现存在局部变量 var a = 2  ,于是执行第4行 console.log(a) ,最终输出为 2  。

B:

 1 var a = 1
 2 function fn1(){
 3   function fn3(){
 4     var a = 4
 5     fn2()
 6   }
 7   var a = 2
 8   return fn3
 9 }
10 function fn2(){
11   console.log(a)
12 }
13 var fn = fn1()
14 fn() //输出多少

观察代码,我们发现在这里fn() 的结果最终由 function fn2(){console.log(a)} 决定,执行fn2,但在其中没有声明a,于是在其上一级作用域中寻找,发现存在全局变量 var a = 1,于是最终结果输出为1 。

C:

 1 var a = 1
 2 function fn1(){
 3
 4   function fn3(){
 5     function fn2(){
 6       console.log(a)
 7     }
 8     var a
 9
10     fn2()
11     a = 4
12   }
13   var a = 2
14   return fn3
15 }
16 var fn = fn1()
17 fn() //输出多少

观察代码,我们发现在这里fn() 的结果最终由fn2()决定,在fn3()中fn2()在执行的时候,其内部并没有声明变量a,于是向上一级作用域找,找到局部变量a,它虽已声明但还没有赋值(赋值在其后),所以最终输出为 undefined 。

小结一下:

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

简单先写到这里吧,有不当之处欢迎批评指正。

个人博客,引用请注明出处。

原文地址:https://www.cnblogs.com/xuanang/p/9219118.html

时间: 2024-10-10 06:56:52

简单说说Javascript中的作用域链的相关文章

JavaScript中的作用域链和闭包

JavaScript中的作用域链和闭包 2012-06-29 11:41 1878人阅读 评论(46) 收藏 举报 JavaScript中出现了一个以前没学过的概念——闭包.何为闭包?从表面理解即封闭的包,与作用域有关.所以,说闭包以前先说说作用域. 作用域(scope) 通常来说一段程序代码中使用的变量和函数并不总是可用的,限定其可用性的范围即作用域,作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突. 全局作用域(Global Scope) 在代码中任何地方都能访问到的对象拥

JavaScript中的作用域链原理

执行环境 作用域链的形成与执行环境(Execution Environment)相关,在JavaScript当中,产生执行环境有如下3中情形: 1 进入全局环境 2 调用eval函数 3 调用function 在一个执行环境A上可以创建执行环境B,执行环境B又可以创建执行环境C...,这一系列的执行环境构成执行环境栈,最新创建的执行环境位于栈顶(栈底永远是全局执行环境),当栈顶执行环境结束之后(与之相关的代码执行结束)就会被弹出站外,底下的执行环境就会成为新的栈顶.如下图所示: 一个执行环境由3

js中的作用域链

js中的执行环境: 所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据 ,决定了它们各自的行为.而每个执行环境都有一个与之相关的变量对象,环境中定义的所有变量和函数都保存在这个对象中. js中的作用域链: 每个函数都有自己的执行环境,当代码在执行环境中执行时,就会创建变量对象的作用域链.作用域链保证了对执行环境有权访问所有变量和函数的有序访问.作用域链的前端,始终都是当前执行的代码所在的环境的变量对象,如果环境是一个函数,那么它的

图解JavaScript中的原型链

转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof obj和obj instanceof Type来识别类型,那么两者的区别在哪?先来看两段代码 <!--typeof obj的方式判断--> <script>    var str = "toby";    console.log(typeof str);// stri

javascript中函数作用域之”提升“

javascript中函数作用域之变量提升 当我们在函数内部用关键字var声明一个变量的时候,此变量的作用域限制在当前函数. 提升:在一个作用域内部,不管一个变量用var声明的位置在哪里,这个变量属于当前整个作用域,并且在当前作用域的任何位置都可以访问它.在javascript中,这种行为/现象称之为"提升",即一个变量在一个作用域的任何位置用var声明,javascript引擎都会把这些用var声明的变量"移动"到当前作用域的开始处. 谈到javascript这种

【翻译】JavaScript中的作用域和声明提前

原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译开始=== 你知道下面的JavaScript脚本执行结果是什么吗? 1 var foo=1; 2 function bar(){ 3 if(!foo){ 4 var foo=10; 5 } 6 alert(foo); 7 } 8 bar(); 如果你对弹出的结果是"10"感到惊讶的话,那么下面这段脚本会让你晕头转向的: 1 var a=1

JavaScript中的作用域和作用域链(边学边写)[看着别人的博客纯手敲]

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域的工作原理.今天这篇文章对JavaScript作用域和作用域链简单的介绍,希望能帮助大家更好的学习JavaScript. JavaScript作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 1.全局作用域(Global Scope

JavaScript中的作用域 、作用域链和闭包

JavaScript中作用,作用域链和闭包详解 一.作用域在js中有全局变量和局部变量之分:比如var a = 1;function sum(){var b=1console.log(b) //1console.log(a) //2 }sum()console.log(a) //3console.log(b) //4 例子中 a 是全局变量,b是局部变量(定义在函数内部,只能在函数内部访问)所以第1行正确 函数内部也能访问全局变量 a所以第2行也能正确 第三行也正确.第4行有外部不能访问内部变量

理解JavaScript中的作用域和上下文

JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScript中的很多强大的设计模式提供了坚实的基础. 然而这也概念也非常容易给开发人员带来困惑.为此,本文将全面的剖析这些概念,并阐述不同的设计模式是如何利用它们的. Statement 作者: 景庄,Web开发者,主要关注JavaScript.Node.js.React.Docker等. 原文地址: htt