-
2021-11-29 20:28:42
作用域: 作用域就是变量起作用的区域 或者说 js代码 执行时,查找变量的范围.
ES5 及以前 :JS的变量作用域分为:全局作用域和函数作用域
ES6开始有了let 关键字后 :
变量有了块级作用域,所谓块级作用域中的块 表示用一对花括号括起来的代码.
不管是全局作用域还是块级作用域,其实都是块级作用域,无非是大块还是小块的问题
作用域链:
作用域链是指:当js编译器在寻找变量时,先在最近的作用域(花括号)里找,如果找不到,则从上一级作用域(花括号)里找,依次类推,直到找到或者找不到为止。这就是作用域链.
什么是作用域链?
a.简单来说就是作用域集合,当前作用域-- 父级作用域---全局作用域 形成的作用域链条
b.全局作用域的变量和方法都可以进行调用
c.局部的变量和方法只能局部进行调用(除闭包外)
d.局部可以访问全局的变量和方法
更多相关内容 -
理解JavaScript作用域和作用域链
2021-03-02 00:10:16作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序... -
作用域和作用域链的理解
2021-07-18 18:55:49作用域(scope) 1. 什么是作用域 ...2. 什么是作用域链 如果想得到在当前的作用域里没有定义的变量(即自由变量)的值,需要向父级作用域(下文有解释)寻找,如果父级没有,会接着向上寻找,如果直作用域(scope)
1. 什么是作用域
作用域是在运行代码中某些特定部分中变量、函数和对象的可访问性。也就是说,作用域决定了代码区块中变量和其他的可访问性。
ES6之前JavaScript没有块级作用域,只有全局作用域和局部作用域。ES6的到来,为我们提供了块级作用域,可通过命令let和const来体现。- 所有未定义直接赋值的变量自动声明为全局变量
2. 什么是作用域链
如果想得到在当前的作用域里没有定义的变量(即自由变量)的值,需要向父级作用域(下文有解释)寻找,如果父级没有,会接着向上寻找,如果直到在全局作用域里没有找到,就宣布放弃。这种一层层的关系,就是作用域链。
3. 自由变量取值的理解
无论fn函数在哪里调用,都要到创建fn这个函数的哪个作用域(即静态作用域)里取值。
var a = 10 function fn() { var b = 20 function bar() { console.log(a + b) } return bar } var x = fn(), b = 200 x() //30
原因是JavaScript是解释型语言,他的执行分为解释和执行两个阶段:
解释阶段:
- 词法分析
- 语法分析
- 作用域规则确定
执行阶段:
- 创建执行上下文
- 执行函数代码
- 垃圾回收
也就是说:
- 作用域在函数定义的时候就确定的,不会改变。
- 执行上下文时this的指向是执行时确定的,可随时改变。
-
js作用域及作用域链概念理解及使用
2021-01-21 13:10:21(1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域。 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在... -
Javascript作用域和作用域链原理解析
2020-11-21 02:11:52作用域和作用域链在Javascript和很多其它的编程语言中都是一种基础概念。但很多Javascript开发者并不真正理解它们,但这些概念对掌握Javascript至关重要。 正确的去理解这个概念有利于你去写更好,更高效和更简洁的... -
详解JavaScript作用域和作用域链
2020-12-12 22:42:54虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是作用域 作用域是在运行时代码中的某些特定部分中... -
深入理解JavaScript作用域和作用域链
2020-12-09 02:48:16作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 ... -
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2020-12-09 10:03:55这一章专门讨论与执行上下文直接相关的更多细节,这次我们将提及一个议题——作用域链。 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/ 中文参考:http://www.denisdeng.com/?p=908 ... -
深入理解JavaScript高级之词法作用域和作用域链
2020-10-26 13:46:15主要介绍了JavaScript高级之词法作用域和作用域链,有需要的朋友可以参考一下 -
JS作用域链详解
2022-02-21 17:45:42在 JS 中作用域分为全局作用域和函数作用域,另外函数作用域可以互相嵌套。在下面的例子中,存在着全局作用域 fn 作用域和 bar作用域,他们相互嵌套。 <script> var a = 1; var b = 2; function fn(x...目录
1、作用域
作用域是一套规则,用来确定在何处以及如何查找标识符。在 JS 中作用域分为全局作用域和函数作用域,另外函数作用域可以互相嵌套。在下面的例子中,存在着全局作用域 fn 作用域和 bar作用域,他们相互嵌套。<script> var a = 1; var b = 2; function fn(x) { var a = 10; function bar(x) { var a = 100; b = x + a; return b; } bar(20); bar(200); } fn(0); </script>
2、作用域链
各个作用域的嵌套关系组成一条作用域链。例子中 bar 函数的作用域链式 bar -> fn -> 全局, fn函数保存在作用域链式 fn -> 全局作用域链主要是进行标识符(变量和函数)的查询,标识符解析就是沿着作用域链一级一级的搜索标识符的过程,而作用域链就是保证对变量和函数的有序访问。(1)如果自身作用域中声明该变量,则无需使用作用域链在上面的例子中,如果要在 bar 函数中查询变量 a ,则直接使用 LHS 查询,赋值为 100 即可。(2)如果自身作用域中未声明该变量,则需要使用作用域链进行查找3、自由变量
在当前作用域中存在但未在当前作用域中声明的变量叫自由变量 。如 bar 函数中的变量 b 就是一个自由变量。注意:在程序中如果存在自由变量,那么一定存在作用域链。4、执行环境
执行环境( execution context )也叫上下文、执行上下文环境。每个执行环境都有一个与之关联的变量对象(variable object ),环境中定义的所有变量和函数都保存在这个对象中。JavaScript 代码执行的环境非常重要,而执行环境可以归纳为以下三种:(1)全局代码( Global Code ) : 代码首次执行时的默认环境(2)函数代码( Function Code ) : 程序执行到函数体内时(3)Eval 函数代码( Eval Code ) : 内置 Eval 函数计算的字符串<script> var a = 1; var b = 2; function fn(x) { var a = 10; function bar(x) { var a = 100; b = x + a; return b; } bar(20); bar(200); } fn(0); </script>
以上述代码为例来说明:在 fn 这个函数中保存有 x、a、bar 环境变量,另外还保存了this、arguments 环境变量。
5、执行流程
所谓执行流,就是程序执行的顺序。它的执行顺序为:先执行 var a = 1 ,然后再执行 var b = 2 ,接下来执行 fn(0) ,再执行 var a = 10 ,再执行 bar(20),再执行 var a = 100 ,再执行 b = x + a ,再执行 return b ,再执行 bar(200) ,再执行 var a = 100,再执行 b = x + a ,再执行 return b ,最后程序结束。JavaScript 的运行时流程图如下:6、执行栈
当打开网页或浏览器时, 宿主环境 会将代码传递给 引擎 去执行,引擎首先会创建一个全局执行环境。全局环境中的代码自上而下有顺序的执行,当遇到一个函数时,函数的环境被创建,函数中的代码开始执行;而在函数执行之后,控制权又返还给之前的环境。 ES 这种类似于 " 栈 " 的控制机制,称为 执行栈 。简单的说,执行环境栈就是一个压栈和出栈的过程。(1) 宿主环境:浏览器或者 Node 环境。(2)引擎:从头到尾负责整个 JavaScript 代码的编译及执行过程。(3)栈:一种遵循 " 后进先出 " 原则的有序数据集合,可以简单理解为使用 push() 和 pop() 操作数组。下面以示例来进行说明:<script> console.log(1); function pFn() { console.log(2); (function cFn() { console.log(3); }()); console.log(4); } pFn(); console.log(5); // 输出:1 2 3 4 5 </script>
示意图:
-
JavaScript中的作用域链和闭包
2020-10-28 00:47:22JavaScript中出现了一个以前没学过的概念——闭包。何为闭包?从表面理解即封闭的包,与作用域有关。所以,说闭包以前先说说作用域 -
javascript作用域、作用域链(菜鸟必看)
2020-11-25 22:29:02javascript的作用域和作用域链是我学习最痛苦的一部分,因为我花了好多时间看了好多技术文档都没有理解.大体知道什么意思了,然后还说不出之所以然来. 通过我大量的测试和看技术文档总结了以下理解,虽然不是很有技术... -
JavaScript作用域与作用域链深入解析
2020-12-09 08:50:18作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 ... -
深入理解js原型链和作用域链,了解作用域链和原型链的区别
2020-09-05 19:15:10深入理解js原型链和作用域链,了解作用域链和原型链的区别一、原型链二、作用域链三、原型链和作用域链的区别:总结 一、原型链 每一个构造函数都有一个prototype属性,这个属性就叫原型对象。 每一个构造函数new...深入理解js原型链和作用域链,了解作用域链和原型链的区别
一、原型链
每一个构造函数都有一个prototype属性,这个属性就叫原型对象。
每一个构造函数new出来的对象都有一个–proto–属性,这个属性指向原型对象。
<script> function Car(){ //实例属性: //this.produce = ‘chevrolet‘, this.price = 8800000; } //原型属性: Car.prototype.produce = "BMW"; var chevrolet = new Car(); console.log(chevrolet.produce,chevrolet.price);//BMW 8800000 console.log(chevrolet==Car.prototype);//false; 构造函数new出来的对象和构造函数的原型对象不是同一个对象。 console.log(chevrolet.produce==Car.prototype.produce);//true; /*构造函数new出来的对象和构造函数的原型对象不是同一个对象,为什么构造函数new出来的对象能获取到构造函数原型对象的 属性:因为每一个构造函数new出来的对象都有一个--protot--原型链,该原型链可以把new出来的对象和原型对象连接在一起。 */ </script>
<script> // function Car(){ // //实例属性: // this.produce = ‘chevrolet‘, // this.price = 8800000; // } // var chevrolet = new Car(); // console.log(chevrolet.produce,chevrolet.price);//chevrolet 8800000 // function Car(){ // //实例属性: // // this.produce = ‘chevrolet‘, // this.price = 8800000; // } // //原型属性: // Car.prototype.produce = "BMW";//prototype相对于构造函数而言,写法:构造函数名.prototype.属性 // var chevrolet = new Car(); // console.log(chevrolet.produce,chevrolet.price);//BMW 8800000 // function Car(){ // //实例属性: // this.produce = ‘chevrolet‘, // this.price = 8800000; // } // //原型属性: // Car.prototype.produce = "BMW"; // var chevrolet = new Car(); // console.log(chevrolet.produce,chevrolet.price);//chevrolet 8800000 原型链的解析过程:先找实例属性,再找原型属性。 function Car(){ //实例属性: //this.produce = ‘chevrolet‘, this.price = 8800000; } //原型属性: // Car.prototype.produce = "BMW"; var chevrolet = new Car(); Object.prototype.produce = ‘Audi‘; console.log(chevrolet.produce,chevrolet.price);//Audi 8800000 //原型链的解析过程:先找实例属性,再找原型属性,若实例属性和原型属性都不存在,则找Object的原型属性。 </script>
二、作用域链
全局作用域、局部作用域。
<script> var num = 10; function fn(num){ num = 20; } fn(); console.log(num);//10 //向上查找,在函数体内找到同样的变量,操作的就是局部,否则是全局。 //题解:1.找var,fn-->2.逐行解析代码:全局变量num;遇到函数跳过;调用函数,解析函数体:变量num向上查找,在函数体内 //找到形参num,所以此处num是局部变量,因此输出结果为全局变量num=10。 </script>
<script> var num = 10; function fn(){ num = 20; } fn(); console.log(num);//20 //题解:1.找var,fn——>2.逐行解析代码:全局变量num;遇到函数跳过;调用函数,解析函数体:变量num向上查找,在函数体内 //没有找到num,继续在全局范围内找,找到全局变量num,并将num=20赋值于全局变量,因此输出结果为全局变量num=20。 </script>
<script> var num = 10; function fn(){ var num = 20;//在函数体内部使用var明确定义的变量是私有变量。 } fn(); console.log(num);//10 //题解:函数调用后,函数体内的变量会被销毁,所以输出结果10。 </script>
三、原型链和作用域链的区别:
原型链:原型链作用在构造函数上,原型链操作的是构造函数的属性:实例属性和原型属性;
作用域链:作用域链作用域普通函数上,操作的是全局变量和局部变量。
总结
good afternoon -
深入理解Javascript中的作用域链和闭包
2020-10-19 23:34:10之前我们讲到数组遍历, 本文我们更进一步, 讲讲如何提高遍历的效率. 下面这篇文章主要深入的介绍了Javascript中作用域链和闭包的相关资料,需要的朋友可以参考下 -
跟我学习javascript的作用域与作用域链
2020-11-22 15:55:02作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 一、... -
js面试与笔试---理解 JavaScript 作用域和作用域链
2018-07-29 16:39:57任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。 1. 全局作用域... -
javascipt作用域、作用域链
2020-04-17 14:34:12本PPT以一个小demo作为案例,进行透彻的分析作用域,以及作用域链产生的过程,帮助你深刻理解作用域。 -
浅析JavaScript中作用域和作用域链
2020-10-20 23:09:40本文主要介绍了JavaScript中作用域和作用域链解析,条理分明,方便理解,这里推荐给小伙伴们,有需要的朋友可以参考下 -
作用域链的理解
2019-10-07 14:43:54在理解之前要先明白几个概念: 执行环境:定义了变量和函数有权访问的数据。 变量对象:执行环境里定义所有的变量和函数都在这个对象里,代码无法访问,但是解析器可以访问。...什么是作用域链:作用域链的... -
详解JS 作用域与作用域链
2022-04-08 09:03:40作用域和作用域链方面的知识是JS的重点,去面试十个有八个都会问你这块的知识,所以说这块是特别特别的重要,下面我们好好理解一下什么是作用域 先上一段代码: var a = 'jack'; function fn() { var a = 'frank... -
JavaScript作用域链使用介绍
2020-11-30 21:54:07之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时候发现作用... -
深入理解JavaScript执行上下文与作用域链
2022-04-19 20:35:40作用域链 总结 前言 只有理解了执行上下文与作用域,才能更好地理解JavaScript语言本身 一、执行上下文 简单引入:执行上下文(也称上下文)是当前代码的执行环境。(建议阅读时自动将执行上下文理解成... -
JavaScript作用域链实例详解
2020-12-09 16:54:21本文实例讲述了JavaScript作用域链。分享给大家供大家参考,具体如下: 跟其他语言一样,变量和函数的作用域揭示了这些变量和函数的搜索路径。对于JavaScript而言,理解作用域更加重要,因为在JavaScript中,作用域... -
详解JavaScript作用域、作用域链和闭包的用法
2020-10-14 20:10:10主要介绍了JavaScript作用域、作用域链和闭包的用法,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下