JavaScript的变量,作用域和内存问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript的变量,作用域和内存问题相关的知识,希望对你有一定的参考价值。

一,javascript中的变量

1,JavaScript变量是松散类型的,决定了它的本质就是:在特定的生命周期中,保存特定的值。因为不存在定义某个变量必须要保存何种数据类型,因此其值和数据类型是可以在生命周期内改变。,

2,JavaScript变量有两种数据类型的值:基本类型值和引用类型值。引用类型值是用多个值构成的对象。

在将一个值赋值给一个变量时,解析器必须先确定这个是基本数据类型还好引用类型值。

其中5中基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值;引用类型的值保存的是内存中的对象,(也就是说不能直接改变对象中的具体指,必须先访问该变量访问到对象地址。引用类型的值是按引用访问的。)

3,属性的可变现:基本数据类型,可以改变值;引用数据类型,可以对属性增删改查,

4,复制变量值:(赋值给另一个变量)

按值传递是做了一个副本,在副本上操作和原来的变量没有关系;按引用传递是指向同一个文件,比如obj1复制给obj2,则obj1和obj2,改变文件,都会影响彼此的值。

。。。。。。。。

5,变量作为传递参数(无论是基本数据类型还是引用数据类型,都是按照值传递!!!!)

基本数据类型按值传递没什么疑问,但是引用类型呢?说引用类型按值传递,更准确的说是引用类型是将全局引用类型的地址按值传递。然后按照引用类型切断指向的规则,处理!!!!!!!!!!

(如果在函数体内新建对象,指向外部的引用类型,操作新对象并不会影响外部引用类型)

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

//在这里并没有在函数体内创建新的对象,而是按值传递创建了一个obj,指向person 。利用该地址声明并赋值了一个属性。这样再利用person访问,就同样会访问到了,而结束后,obj就消失了。但是person中的内容却保存了下来。

function setName(obj){ obj.name="sdfsd";obj=new object();obj.name="abc";} var person=new Object();setName(person);alert(person.name);//sdfsd;

//在这里函数体中又声明了一次obj,这样就切断了原来obj的指向。这样就和person没有关系了。以后的操作就是各自操作各自的了、

6,检查类型

     要检查一个变量是不是基本数据类型,用的是typeof

     如果是基本数据类型,则返回基本数据类型的类型,如果是null或者对象,则都是返回Object(这样就不能区分是什么类型的对象了)

    instanceof操作符,则对对象来判断是否属于某种引用类型,返回的是true或者false;例如:alert(person instaceof Array);判断是否是个数组对象。

二,执行环境和作用域

   1, 执行环境,定义了变量或者函数有权利访问其他数据的权利。

    在web浏览器中,全局环境被认为是window对象,因此所有的全局变量和函数都是作为window的属性和方法。

   在某个环境中执行完,其变量和函数自动销毁。

    2,作用域链。

    保证对执行环境有权访问的变量和函数进行有序的访问。执行顺序是从作用域前端,依次往上寻找。例如:一个函数会,先在函数体中作用,影响了外部的某变量,则变量再往上寻找,来作用。

   3,延长作用域链

     在作用域链前端临时增加一个变量对象,该变量对象会在代码执行完后移除,有两种情况会是这样的:

    try-catch语句的catch语句块(会创建一个新的变量对象,包含的是被抛出的错误对象的声明);with语句(将变量添加到指定的作用域中,如url和location.url);

  4,没有块级作用域

    既是在{}中的局部变量在C语言或者java语言中,在外部是不能访问的到的,而在JavaScript还是会访问到。这里说 的{}是指语句的{},而不是函数的局部变量。函数中的局部变量还是不会释放到外部

  这个的原因主要是因为在语句的{}中并没有封闭的执行环境,他们还是在同一个执行环境中,因此会访问到。而其他语言是不能的!!!!!

三,垃圾清除

      JavaScript的垃圾回收是自动回收机制,离开作用域的变量值将被自动标记,自动清除。

      “标记清除”是目前最主流的垃圾回收机制,思想是给当前不使用的值上加上标记,然后回收。

      “引用计数”思想是记录所有值被引用的次数,这种算法是有问题的!!!!!例如循环引用。

  解除一个对象的占用空间直接用null就可以了。

 

 

   

        

 

以上是关于JavaScript的变量,作用域和内存问题的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级程序设计学习之变量作用域和内存问题

JavaScript 变量作用域和内存问题

javascript中的变量作用域和内存问题

JavaScript(变量作用域和内存问题)

JavaScript 变量作用域和内存问题

javascript 变量作用域和内存问题