• JS学习之作用域


    JS中的作用域有两种:

    1.window/global 全局作用域

    2.函数执行时形成的私有作用域

    栈内存(作用域):js代码执行的那个环境;存储基本数据类型值;
    堆内存:在js中,对于引用数据类型来说,首先会开辟一个新的内存空间,然后把("属性名:属性值"/"函数体中的代码字符串")存储到这个空间中,最后把空间的地址给相关的变量,这个新开辟的这个内存空间称之为"堆内存"。堆内存的作用:存储引用数据类型值的

    一、全局作用域

    在浏览器加载我们HTML页面的时候,首先会开辟一个供js代码执行的环境,即全局作用域,这是一个栈内存

    全局变量:在全局作用域下定义的变量

     

    二、私有作用域

    函数执行时形成一个新的私有作用域,这也是一个栈内存

    私有变量:在私有作用域中经过预解释的变量,形参也是私有变量。

    函数执行的顺序:给形参赋值-->预解释-->完成后私有作用域中的代码从上到下执行。

    在私有作用域中出现的变量,我们首先看是否为私有变量,如果是私有变量,那么函数中用的都是私有的变量;如果不是私有的变量,则往上一级查找;

     

    关于如何查找上级作用域问题:首先看当前的函数对应的堆内存是在哪个作用域下定义的,在谁下面定义的,它的上级作用域就是谁。

     1     var a = 12;
     2     function fn() {
     3         var a = 13;
     4         function f() {
     5             console.log(a);
     6         }
     7         return f;
     8     }
     9     function sum() {
    10         var a = 14;
    11         var f = fn();
    12         f();//13 f对应的堆内存是在函数fn里面定义的,所以f的上级作用域是fn,所以里面用到的a找的是上级作用域fn中的13
    13     }
    14     sum();
    15     var f=fn();
    16     f();//13

     关于作用域销毁与不销毁或者不立即销毁问题:

    销毁的作用域:
    一般情况下,函数执行完成后,浏览器会把这个函数形成的私有作用域进行回收,当前的作用域都立即销毁。
    不销毁的作用域:
    当函数执行的时候,在私有作用域中返回了一个引用数据类型的值(例如:一个函数、一个对象、一个数组...),并且在函数的外面,有变量接收了这个返回值,此时当前的这个私有的作用域就被占用了,这个作用域也不能销毁了。
    作用域不销毁,里面的私有变量也不会被销毁(这跟下一篇要讲的闭包的应用有关)
     1     function fn() {
     2         var a = 12;
     3         return function () {
     4             a++;
     5             console.log(a);
     6         };
     7         var c = 13;
     8     }
     9     var f = fn();
    10     f();//13
    11     f();//14

    不立即销毁的作用域:
    当函数执行的时候,在私有作用域中返回了一个引用数据类型的值(例如:一个函数、一个对象、一个数组...),但是并没有变量在函数的外面接收,那么浏览器暂时先不销毁,等到浏览器空闲的时候,会自己销毁这个作用域。

  • 相关阅读:
    组件GIS 0 前言
    GIS数据结构与算法
    GIS数据结构与算法 0 前言
    Git推送本地工程到远程仓库
    为知笔记+Typora+PicGo发表博客园博客
    时间记录"时间块"的使用技巧
    WebGIS学习路线
    [c++指针教程]用简单链表练习指针
    动态规划题目整理
    图论刷题整理
  • 原文地址:https://www.cnblogs.com/cataway/p/4877240.html
Copyright © 2020-2023  润新知