资讯专栏INFORMATION COLUMN

JavaScript变量、作用域和内存问题

Dr_Noooo / 2893人阅读

摘要:全局变量是最外围的一个执行环境,代码在环境中执行,会创建一个作用域链,用途是保证对执行环境有权访问所有变量和函数的有序访问。作用域链中最后一个对象始终是全局执行环境。内部环境可以通过作用域链访问所有的外部环境,外部则不能访问内部。

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

* 基本类型 : 指的是简单的数据段,五种基本类型是按值访问的,可以直接操作保存在变量中实际的值。
* 引用类型 : 指那些可能由多个值组成的对象,引用类型的值是保存在内存中的对象,js不允许直接访问内存中的位置,也就是不可直接操作对象的内存空间。

操作对象实际是操作对象的引用而不是实际的对象,引用类型的值按引用访问。
2、动态的属性
引用类型的值可以添加属性和方法,也可以删除和修改,但基本类型不行。
//引用类型

var person = new Object();
person.name = "sheyurong";
alert(person.name);      //sheyurong

基本类型添加属性也不会报错。
//基本类型

var name = "sheyurong"
name.age = 27;
alert(name.age) ;           //undefined

3、赋值变量值

//基本类型

var num1 = 5;
var num2 = num1;
// num1 与 num2 中的5完全独立,参与任何操作也不会相互影响

//引用类型

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "syr";
alert(obj.name);   //"syr";
改变其中任一变量也会影响另一个,因为两个变量引用同一变量。

4、传递参数
es中所有函数的参数都是按值传递的,基本类型与引用类型的传参与变量的复制一样。

function setName(obj){
    obj.name = "syr";
    obj = new Object();
    obj.name = "abc"
}
var person = new Object();
setName(person);
alert(person);   // "syr"
//可以把函数的传参想象成局部变量一样

5、检测类型
typeof可以检测基本类型,但检测对象时并不能知道是什么类型的对象,因此,使用instanceof操作符。
语法 :

result = variable instanceof constructor
//如果变量为引用类型的实例,则instanceof返回true
例 : person instanceof Object; // person是Object的实例吗?
根据规定,所有引用类型都是object的实例,instanceof检测基本类型,适中返回false,因为基本类型不是对象。

6、执行环境及作用域

* 执行环境决定了变量或函数有权访问的其他数据,决定了她们各自的行为。
* 每个执行环境都有一个环境变量对象,所有变量和函数都保存在这里面,无法访问,但是后台会使用它。
* 全局变量是最外围的一个执行环境,代码在环境中执行,会创建一个作用域链,用途是保证对执行环境有权访问所有变量和函数的有序访问。
* 作用域链 : 如环境是函数,则最开始只包含有一个变量-arguments对象 -> 外部环境1 -> 外部环境2 ... -> 全局。

作用域链中最后一个对象始终是全局执行环境。

* 内部环境可以通过作用域链访问所有的外部环境,外部则不能访问内部。函数参数的访问规则与执行环境其他变量相同。

7、延长作用域链

* 使用try-catch语句的catch块;
* with语句 : 

都是会在作用域链的前端添加一个变量对象,with可将制定对象添加到作用域链中。
catch创建新变量,内涵跑出的错误对象声明。

例 : function build(){
    var qs = "aaa";
        with(location){
            var url = href + qs;
        } return url ;
}
//with吧location对象引入,此种就包含了location中所有属性和方法。










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

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

相关文章

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

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

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

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

    imtianx 评论0 收藏0
  • JS学习笔记(第4章)(变量作用域和内存问题

    摘要:具体来说就是当执行流进入下列任何一个语句时,作用域链就会得到加长语句的块和语句。这两个语句都会在作用域链的前端添加一个变量对象。对来说,会将指定的对象添加到作用域链中。 1. 基本类型和引用类型的值 JavaScript变量可以用来保存两种类型的值:基本类性值和引用类性值。基本类型值源自以下5种基本数据类型:Undefined、Null、Boolean、Number和String。基本...

    linkin 评论0 收藏0
  • 深入javascript——作用域和闭包

    摘要:注意由于闭包会额外的附带函数的作用域内部匿名函数携带外部函数的作用域,因此,闭包会比其它函数多占用些内存空间,过度的使用可能会导致内存占用的增加。 作用域和作用域链是javascript中非常重要的特性,对于他们的理解直接关系到对于整个javascript体系的理解,而闭包又是对作用域的延伸,也是在实际开发中经常使用的一个特性,实际上,不仅仅是javascript,在很多语言中都...

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

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

    wuyangchun 评论0 收藏0

发表评论

0条评论

Dr_Noooo

|高级讲师

TA的文章

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