• JavaScript变量,作用域和内存


    一.基本类型的值和引用类型的值

    QQ截图20131018120635

    区别:

    1.

    (1)基本类型值是按值访问的,可以操作保存在变量中实际的值,保存在栈内存中

    (2)引用类型值是按引用访问的,操作对象时,实际在操作对象的引用而不是实际的值,保存在堆内存中

    (3)包含引用类型的变量实际包含的并不是对象本身,而是一个指向该对象的指针

    2.添加属性

    引用类型的值可以为其添加属性和方法,基本类型的值不可以

    3.复制变量值

    (1)复制基本类型的值:创建这个值的副本

    (2)复制引用类型的值:复制的是指针,两个变量引用同一个对象

    4.传递参数

    (1)ECMAScript中访问变量有按值和按引用两种方式,而参数只能按值传递

    (2)参数可以看成是局部变量

    (2)基本类型值的传递和基本类型变量的复制一样,被传递的值会复制给参数

    function addNum(num){
        num+=10;
        return num;
    }
    var num1=20;
    var result=addNum(num1);//参数按值传递
    alert(num1);    //20  没变化
    alert(result);  //30

    (3)引用类型值的传递和引用类型变量的复制一样,把这个值在内存中的地址复制给参数,因此参数的变化会反映在函数外部

    function myObject(obj){
        obj.name="liu";
        obj = new Object(); //重写时引用的是局部对象,在函数执行完后销毁
        obj.name="yang;"
    }
    var person=new Object();
    myObject(person);    //参数按值传递
    alert(person.name);  //"liu" obj和person引用同一个对象

    5.检测类型

    (1)用typeof检测基本数据类型

    (2)用instanceof检测引用数据类型

    所有引用数据类型都是Object 的实例

    alert(person instanceof Object);//true

    二.执行环境及作用域

    1.所有变量都存在于一个执行环境(也称作用域)中

    2.执行环境有全局执行环境(web浏览器的全局执行环境是window对象)和函数执行环境

    3.每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链

    4.内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数

    var color="blue";
    function changeColor(){
        var anotherColor="red";
    
        function swapColor(){
            var otherColor="green";
            //这里可以访问color,anotherColor,otherColor
        }
        //这里可以访问color,anotherColor
        swapColor();
    }
    changeColor();
    //这里只能访问color
    QQ截图20131018130142 
    5.延长作用域链
    6.没有块级作用域
    1.块级作用域:被花括号封闭起来的代码块都有自己的作用域
    2.会将控制语句中的变量声明添加到执行环境中
    if(true){
        var color="blue";//将变量添加到当前执行环境中
    }
    alert(color);
    for(var i=0;i<10;i++){
        do(i);
    }
    alert(i);//10 for结束后i依旧存在于循环外部的执行环境中
    3.声明变量:全局变量,var声明局部变量

    4.查询标识符

    var color="blue";
    function getColor(){
        return color;
    }
    alert(getColor());//"blue"
    QQ截图20131018123748

    三.垃圾收集

    1.标记清除

    2.引用计数

    (1)有循环引用时会无法清除(IE中的DOM,BOM)

    3.管理内存

    (1)解除引用:数据不再用时将其值设为null

    (2)应及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用

  • 相关阅读:
    搭建JUnit环境
    搭建日志环境并配置显示DDL语句
    先建表还是先建实体类
    hbm2ddl
    总结与提纲
    常见O/R框架介绍
    hibernate 模拟实现和What is and Why O/R Mapping
    hibernate 注解不给提示
    额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~
    导入android工程@Override报错
  • 原文地址:https://www.cnblogs.com/liuzhongyi1992/p/3439776.html
Copyright © 2020-2023  润新知