zoukankan      html  css  js  c++  java
  • 浅谈javascript中变量作用域和内存(2)

    1、无块级作用域

    javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦。在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域

    举个例子

    if(true) {
        var name = "saber"
    };
    console.log(name)//saber

    上面的代码可以看到,if判断语句中定义的变量所在的环境是全局环境,因此在if判断外面也能访问到该变量

    (1)声明变量

    function add(num1,num2){
        // var sum = num1+num2;//注意:如果下面sum = num1+num2;换成本行的话,会报错sum is not defined,因为使用了var定义sum,导致该变量会被添加到最近的局部环境中,也就是add函数中,因此外部访问不到,就会报错未定义
        sum = num1+num2;//这里没有使用var,当函数执行完后,sum被添加到全局环境中,因此函数外部能访问到
        return sum;
    }
    var result = add(7,7);
    console.log(sum)//14
    console.log(result)//14

    (2)查询标识符

    就不说废话了,直接上代码解释:

    var name = "saber";
    function getName(){
        return name;
    }
    console.log(getName())//saber

    在调用函数getName的时候会引入定义的变量name。为了确定name的值,将开始两步搜索过程。首先搜索getName()的对象,看看是否包含一个叫name的标识符。好的,没有呢,那就继续找下一个变量对象,啊哈到了全局环境的变量对象了哈,哦豁找到了定义的name变量,结束。

    简单来说就是从局部环境开始:开始→局部环境→上一级环境→上一级...→全局环境→结束。

    哪有人说,假如我在函数内部就定义了,结果会怎样,你看!

    var name = "saber";
    function getName(){
        var name = "archer";
        return name;
    }
    console.log(getName())//archer

    原因很简单,从局部环境开始查询,查到后,就没后面什么事了,搜索停止。

    2、垃圾回收机制

    js能自动管理内存的回收,具体原理很简答:

     找出那些不再使用的变量,然后释放其占用的内存。

    3、管理内存

    在代码执行中值保存必要的数据,一旦数据不再有用,最好将其设为null来是释放引用——解除引用

    function getName(){
        var name = "saber";
        return name;
    }
    var person = getName()
    console.log(person)//saber
    person = null//解除引用

    解除引用不意味着自动回收这个值所占的内存,真正地作用是让值脱离执行环境,方便垃圾收集器下次运行时将其回收

    作者:SaberInoryKiss

    出处:SaberInoryKiss的博客--https://www.cnblogs.com/SaberInoryKiss

    您的支持是对博主最大的鼓励,感谢您的认真阅读。

    本文版权归作者所有,欢迎转载,但请保留该声明。

  • 相关阅读:
    hdu 1520(简单树形dp)
    hdu 1561(树形dp)
    hdu 2809(状压dp)
    hdu 2196(求树上每个节点到树上其他节点的最远距离)
    hdu 4003(树形dp)
    hdu 3899(树形dp)
    hdu 4714(树形dp)
    hdu 3905(dp)
    Linux mariadb(Mysql)的主从复制架构
    面向对象静态变量代码题
  • 原文地址:https://www.cnblogs.com/SaberInoryKiss/p/11772404.html
Copyright © 2011-2022 走看看