zoukankan      html  css  js  c++  java
  • JavaScript基础笔记(二)变量、作用域和内存问题

    变量、作用域和内存问题

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

    基本类型值:简单的数据段

    引用类型值:由多个值构成的对象

    基本类型是按值访问的,引用类型是按引用访问的。

    不能给基本类型的值添加属性,尽管不会报错。

    当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到
    为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一
    个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另
    一个变量

    ECMAScript 所有函数的参数都是按值传递的

    function setName(obj) {
    obj.name = "Nicholas";
    }
    var person = new Object();
    setName(person);
    alert(person.name); //"Nicholas"
    function setName(obj) {
    obj.name = "Nicholas";
    obj = new Object();
    obj.name = "Greg";
    }
    var person = new Object();
    setName(person);
    alert(person.name); //"Nicholas"

    检测一个对象是什么类型的对象:instanceof,语法:

    result = variable instanceof constructor
    alert(person instanceof Object); // 变量 person 是 Object 吗?
    alert(colors instanceof Array); // 变量 colors 是 Array 吗?

    二、执行环境及作用域

    一)重要概念

    执行环境:定义了变量或函数访问其他数据的权限。

    变量对象:用于保存执行环境中所有的变量和函数,每个执行环境中都有一个变量对象。

    全局执行环境:最外围的一个执行环境,根据ECMAScript实现的宿主环境不同而不同。在Web浏览器中,全局执行环境通常是window。

    某个执行环境所有代码执行完毕后,该环境和其中的变量函数被销毁。

    每个函数都有自己的执行环境,当一个函数执行完毕后,会把控制权限返还给外层的执行环境。

    作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证

    对执行环境下的变量和函数的有序访问。作用域链的前端,始终都是当前执行代码所在环境的变量对象。

    在函数环境中,将其活动对象作为变量对象。全局执行函数的变量对象,始终是作用域链的最后一个对象。

             window.onload = function () {
                var a = 'red';
                function f() {
                    var b = 'blue';
                    function m() {
                        var c = 'green';
                        //这里能访问a,b,c
                    }
                    //这里能访问a,b
                }
                //这里只能访问a
            }

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

     二)延长作用域链

    1)try-catch中的catch块

    2)with语句

    这两个语句都会在作用域链的前端添加一个变量对象。对 with 语句来说,会将指定的对象添加到
    作用域链中。对 catch 语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

    三)没有块级作用域

    if (true) {
        var a = "b";
    }
    alert(a);  //b

    特别注意:

    for (var i =0;i<10;i++) {
    }
    alert(i); //10
    Simple is important!
  • 相关阅读:
    文字超出2行显示省略号
    js调试工具console方法详解
    下厨如有神
    画地为牢——广州经济困局
    数字桩和记忆术
    想象力提高记忆能力的重要能力
    三元色
    轻松自我介绍三步走——曼陀罗思考法
    英语单词_巩固方法草稿A
    http、TCP/IP协议与socket之间的区别
  • 原文地址:https://www.cnblogs.com/Shadowplay/p/8380108.html
Copyright © 2011-2022 走看看