[JavaScript]-----变量,作用域,内存

ECMAScript 函数的参数都将是局部变量,也就是说,没有按引用传递。

一.变量及作用域

PS:在某些语言中,字符串以对象的形式来表示,因此被认为是引用类型。ECMAScript
放弃这一传统。

1.基本类型和引用类型的值
ECMAScript 变量可能包含两种不同的数据类型的值:基本类型值和引用类型值。基本
类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。
而引用类型值则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指
针,这个指针指向内存中的另一个位置,该位置保存对象。
将一个值赋给变量时,解析器必须确定这个值是基本类型值,还是引用类型值。基本类
型值有以下几种:Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占
有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

2.动态属性
定义基本类型值和引用类型值的方式是相似的:创建一个变量并为该变量赋值。但是,
当这个值保存到变量中以后,对不同类型值可以执行的操作则大相径庭。

3.复制变量值
在变量复制方面,基本类型和引用类型也有所不同。基本类型复制的是值本身,而引用
类型复制的是地址。

4.传递参数
ECMAScript 中所有函数的参数都是按值传递的,言下之意就是说,参数不会按引用传
递,虽然变量有基本类型和引用类型之分。

5.执行环境及作用域
var box = 'blue'; //声明一个全局变量 (window)
function setBox() {     (window下)
alert(box); //全局变量可以在函数里访问
}
setBox(); //执行函数
全局的变量和函数,都是window 对象的属性和方法。即:
var box = 'blue';
function setBox() {
alert(window.box); //全局变量即window 的属性
}
window.setBox(); //全局函数即window 的方法

6.没有块级作用域
块级作用域表示诸如if 语句等有花括号封闭的代码块,所以,支持条件判断来定义变
量。
if (true) { //if 语句代码块没有局部作用域
var box = 'Lee';
}

alert(box);


var 关键字在函数里的区别
function box(num1, num2) {
var sum = num1 + num2; //如果去掉var 就是全局变量了
return sum;
}
alert(box(10,10));
alert(sum); //报错


PS:非常不建议不使用var 就初始化变量,因为这种方法会导致各种意外发生。所以初
始化变量的时候一定要加上var。

alert(i);


二 内存问题

JavaScript 最常用的垃圾收集方式是标记清除。

一般来说,确保占用最少的内存可以让页面获得更好的性能。那么优化内存的最佳方案,
就是一旦数据不再有用,那么将其设置为null 来释放引用,这个做法叫做解除引用。这一
做法适用于大多数全局变量和全局对象。

var o = {
name : 'Lee'
};
o = null; //解除对象引用,等待垃圾收集器回收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章