精华内容
下载资源
问答
  • 2021-11-29 20:28:42

    作用域: 作用域就是变量起作用的区域 或者说 js代码 执行时,查找变量的范围.

    ES5 及以前 :JS的变量作用域分为:全局作用域和函数作用域

    ES6开始有了let 关键字后 :

    变量有了块级作用域,所谓块级作用域中的块 表示用一对花括号括起来的代码.

    不管是全局作用域还是块级作用域,其实都是块级作用域,无非是大块还是小块的问题

    作用域链:

    作用域链是指:当js编译器在寻找变量时,先在最近的作用域(花括号)里找,如果找不到,则从上一级作用域(花括号)里找,依次类推,直到找到或者找不到为止。这就是作用域链.

    什么是作用域链?

    a.简单来说就是作用域集合,当前作用域-- 父级作用域---全局作用域 形成的作用域链条

    b.全局作用域的变量和方法都可以进行调用

    c.局部的变量和方法只能局部进行调用(除闭包外)

    d.局部可以访问全局的变量和方法

    更多相关内容
  • 作用域是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的指向是执行时确定的,可随时改变。
    展开全文
  • (1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域。 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在...
  • 作用域和作用域链在Javascript和很多其它的编程语言中都是一种基础概念。但很多Javascript开发者并不真正理解它们,但这些概念对掌握Javascript至关重要。 正确的去理解这个概念有利于你去写更好,更高效和更简洁的...
  • 虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是作用域 作用域是在运行时代码中的某些特定部分中...
  • 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 ...
  • 这一章专门讨论与执行上下文直接相关的更多细节,这次我们将提及一个议题——作用域链。 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/ 中文参考:http://www.denisdeng.com/?p=908 ...
  • 主要介绍了JavaScript高级之词法作用域和作用域链,有需要的朋友可以参考一下
  • JS作用域链详解

    千次阅读 2022-02-21 17:45:42
    在 JS 中作用域分为全局作用域和函数作用域,另外函数作用域可以互相嵌套。在下面的例子中,存在着全局作用域 fn 作用域和 bar作用域,他们相互嵌套。 <script> var a = 1; var b = 2; function fn(x...

    目录

    1、作用域

    2、作用域链

    3、自由变量

    4、执行环境

    5、执行流程

    6、执行栈


    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 这个函数中保存有 xabar 环境变量,另外还保存了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中出现了一个以前没学过的概念——闭包。何为闭包?从表面理解即封闭的包,与作用域有关。所以,说闭包以前先说说作用域
  • javascript的作用域和作用域链是我学习最痛苦的一部分,因为我花了好多时间看了好多技术文档都没有理解.大体知道什么意思了,然后还说不出之所以然来. 通过我大量的测试和看技术文档总结了以下理解,虽然不是很有技术...
  • 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 ...
  • 深入理解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中作用域链和闭包的相关资料,需要的朋友可以参考下
  • 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 一、...
  • 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。  1. 全局作用域...
  • 本PPT以一个小demo作为案例,进行透彻的分析作用域,以及作用域链产生的过程,帮助你深刻理解作用域。
  • 本文主要介绍了JavaScript中作用域和作用域链解析,条理分明,方便理解,这里推荐给小伙伴们,有需要的朋友可以参考下
  • 作用域链理解

    2019-10-07 14:43:54
    理解之前要先明白几个概念: 执行环境:定义了变量和函数有权访问的数据。 变量对象:执行环境里定义所有的变量和函数都在这个对象里,代码无法访问,但是解析器可以访问。...什么是作用域链作用域链的...
  • 详解JS 作用域与作用域链

    千次阅读 2022-04-08 09:03:40
    作用域和作用域链方面的知识是JS的重点,去面试十个有八个都会问你这块的知识,所以说这块是特别特别的重要,下面我们好好理解一下什么是作用域 先上一段代码: var a = 'jack'; function fn() { var a = 'frank...
  • 之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时候发现作用...
  • 作用域链 总结 前言 只有理解了执行上下文与作用域,才能更好地理解JavaScript语言本身 一、执行上下文 简单引入:执行上下文(也称上下文)是当前代码的执行环境。(建议阅读时自动将执行上下文理解成...
  • 本文实例讲述了JavaScript作用域链。分享给大家供大家参考,具体如下: 跟其他语言一样,变量和函数的作用域揭示了这些变量和函数的搜索路径。对于JavaScript而言,理解作用域更加重要,因为在JavaScript中,作用域...
  • 主要介绍了JavaScript作用域、作用域链和闭包的用法,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,644
精华内容 56,657
关键字:

作用域链的理解