资讯专栏INFORMATION COLUMN

变量、作用域和内存问题

lentrue / 2746人阅读

摘要:使用声明的变量会动被添加到最近的环境中查询标识符,现在作用域链的最前端开始搜索,逐步向上级查询,直到找到匹配的标识符,在变量查询中,访问局部变量要比全局变量更快,因为不需要向上搜索作用域。

基本类型和引用类型的值

基本类型值指的是简单的数据段;
引用类型值指那些可能由多个值构成的对象。
不能给基本类型添加属性,可以给引用类型值动态的添加属性。

基本类型按值访问,存放在栈内存中。
引用类型按引用访问,存放在堆内存中,栈内存中存放的是它的地址。

复制引用类型,复制的是栈内存中的地址,所以改变一个变量会影响另一个变量。
不管是栈内存还是堆内存,复制的都是栈内存中的地址。

传递参数

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

function setName(obj){    //这里将要传递一个引用类型的参数,但不是按引用传递,是按值传递
    obj.name = "lee";
}
var person = new Object();//
setName(person);
alert(person.name);        //打印lee
//js没有按引用传参的功能,切记不能把传递引用参数当作按引用传参

传参是局部变量

var box = "Lee";
function setBox = {    //通过传参也是局部变量,作用域在setBox()范围下
    alert(box);        //打印"red"
}
setBox("red");
alert(box);            //打印"Lee"
检测类型

typeof只能检测基本数据类型
instanceof能检测引用类型的值
语法:

result = variable instanceof constructor

使用时构造函数首字母需要大写;
变量和引用类型的值对应返回true,否则返回false
instanceof在检测基本类型时,始终返回false.

作用域

全局环境被认为是window对象

作用域链

作用域链的用途是保证对执行环境的有权访问的所有变量和函数的有序访问。
在同一作用域中可以互相访问;在不同作用域中,全局环境不能访问局部变量,在局部环境中可以访问全局变量。
作用域链例子:

var box = "Lee";
function setBox(){
    function setColor(){    //setColor()方法作用域在setBox()内
        var b = "kkk";        //b的作用域在setColor()内
        alert(b);            //打印kkk
        return 123;            //返回123
    }
    return setColor();        //调用setColor(),返回123
}
alert(setBox());            //调用setBox(),打印123
没有块级作用域

iffor语句的花括号没有作用域的功能。
使用var声明的变量会动被添加到最近的环境中;
查询标识符,现在作用域链的最前端开始搜索,逐步向上级查询,直到找到匹配的标识符,
在变量查询中,访问局部变量要比全局变量更快,因为不需要向上搜索作用域。

垃圾收集

垃圾收集器会在运行的时候给存储在内容中的变量加上标记,然后去掉环境中正在使用变量的标记,没有被去掉标记的标量将被视为准备删除的变量。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94478.html

相关文章

  • 《JavaScript高级程序设计(第3版)》——变量作用域和内存问题(四)

    摘要:执行环境的类型有两种全局全局执行环境局部函数执行环境每个环境都可以向上搜索作用域链,以查询变量和函数名但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。内部可通过作用域链访问外部,外部不能访问内部。 变量、作用域和内存问题 ECMAScript 数据类型 基本类型(5种): Undefined,Null,Boolean,Number,String typeof() 检测...

    YacaToy 评论0 收藏0
  • 变量作用域和内存问题

    摘要:变量作用域和内存问题基本类型和引用类型的值基本类型就是简单的数据段种值类型,而引用类型就是对象操控对象的引用。但是不但能访问自己的变量,也能访问和全局作用域下的变量。延长作用域链相当于创造了一个新的变量对象在当前作用域的上方。 变量作用域和内存问题 1.基本类型和引用类型的值 基本类型就是简单的数据段(5种值类型),而引用类型就是对象(操控对象的引用)。 1.1复制变量值 引用类型实际...

    wuyangchun 评论0 收藏0
  • JavaScript红宝书笔记(四)---变量作用域和内存问题

    摘要:在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。标记清除是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存 1.在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。 2.当从一个变量向另一个变量复制引用类型的值时,两个变量实际上将引用同一个对象,因此,改变其中一个变量,就会...

    imtianx 评论0 收藏0
  • 高程(第四章) 变量作用域和内存问题

    摘要:不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收 1 基本类型和引用类型的值 基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中 引用类型的值是保存在内存中的对象。JavaSc...

    xavier 评论0 收藏0
  • JavaScript变量作用域和内存问题

    摘要:全局变量是最外围的一个执行环境,代码在环境中执行,会创建一个作用域链,用途是保证对执行环境有权访问所有变量和函数的有序访问。作用域链中最后一个对象始终是全局执行环境。内部环境可以通过作用域链访问所有的外部环境,外部则不能访问内部。 1、基本类型和引用类型的值 * 基本类型 : 指的是简单的数据段,五种基本类型是按值访问的,可以直接操作保存在变量中实际的值。 * 引用类型 : 指那些可能...

    Dr_Noooo 评论0 收藏0

发表评论

0条评论

lentrue

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<