javaScript变量、作用域
javaScript的变量和其他语言的变量有很大的区别,javaScript变量松散类型的本质,决定它只是在特定时间用于保存特定值的一个名字而已。由于不存在必须要保存何种数据类型值的规则,变量的值和数据类型可以在脚本的生命周期内变化。
一、基本类型和引用类型的值
基本类型值指的是简单的数据段,而引用类型值可能由多个值构成的对象。在将一个值赋值给变量时,解析器必须确实这个值是基本数据类型值还是引用数据类型值。基本数据类型是按值访问的,可以操作保存在变量中的实际值。引用类型的值是保存在内存中的对象,javaScript不允许直接访问内存中的位置,也就是不能直接操作对象的内存空间。在操作对象时,实际上是操作对象的引用,引用类型的值是按引用访问的。在很多语言中字符串以对象的形式来表示,javaScript放弃了这个传统。
1、动态的属性
引用类型动态地添加属性,基本类型不可以。如果对象不被销毁或者属性不被删除,这个属性将一直存在
2、复制变量值
基本类型复制时,创建一个副本,这个副本是一个与原来类型相同但是相互独立的值,而引用复制的是一个引用,其实就是指针,不同的是这个指针指向同一个对象,所以改变其中一个变量都会影响另一个变量。
3、传递参数
在向参数传递基本类型的值时,被传递的值会复制给一个局部变量。在向参数传递一个引用类型的值时,会把这个值在内存的地址复制给局部变量,因此这个局部变量的变化会反映在函数的外部。
二、执行环境与作用域
执行环境(execution context)定义了变量和函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。
在某个执行环境中的所有代码执行完成后,该环境被销毁,保存在其中的变量和函数也随之销毁,全局变量直到程序退出时才销毁。
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,
而在执行完后栈将其环境弹出,把控制权返回给之前的执行环境。当代码在环境栈中执行时,会创建变量对象的一个作用域链。作用域链保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终是当前执行的代码所在环境的变量对象。如果这个额环境是函数,则将其活动对象作为变量对象。