javascript-第四章-变量

第四章 变量

1.变量的类型

js是无类型的,变量可以存放任意类型的值

2.变量的声明

要使用一个变量,要使用var关键字声明。
var i;
var num;
也可以一次声明多个变量:var i,num;
也可以将变量声明和初始化绑到一块:var message = ‘hello’;
var i=0,k=1;

var 声明的变量是永久性的,用delete运算符删除变量会引发错误。

1
2
3
4
5
6
var i = 10;
delete i; //false
console.log(i); // 10
a=10;
delete a; //true
console.log(a); // a is not defined

重复声明同一个变量是合法的,且不会报错。
如果尝试读取一个未声明的变量的值,会引发错误。
如果给未用var声明的变量赋值,js会隐式的声明该变量,隐式声明变量会使该变量为全局变量。

3.变量的作用域

变量的作用域就是程序中定义变量的区域。全局变量的作用域全局性的,在js中处处有定义。而在函数内部定义的变量只能在函数内部使用,是局部性的。函数的参数也是局部作用域,只在函数内部有定义。
在函数内部,局部变量的优先级比同名的全局变量高.

3.1 没有块级作用域

即函数中声明的所用变量在整个函数中有定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function test(o){
var i=0;
if(typeof o=='object'){
var j = 0;
for(var k=0; k<10;k++){
console.log(k);
}
document.write(k);
}
console.log(i,j,k);
}
test(null); // 0 0 10 i,j,k在整个函数中有定义

var scope='global';
function f(){
console.log(scope);
var scope = 'local';
console.log(scope);
}
f(); // undefined local

3.2 未定义的变量和未赋值的变量

var x; //声明一个未赋值的变量
alert(u); //使用未声明的变量将引发错误
u=3; //给未声明的变量赋值,将创建该变量

4.基本类型

变量具有或存放了值,存放的具体内容就是js所支持的数据类型。
基本数据类型:null,number,string,bool,undefined
引用数据类型:对象,数组和函数。

基本类型在内存中具有固定的大小。引用类型没有固定的大小。
引用类型,变量存储的是对这个值的引用,通常是指针或内存地址。

1
2
3
4
5
6
7
8
9
var a = 3.14;
var b = a;
a = 4;
console.log(b); //3.14

var a = [1,2,3];
var b = a;
A[0]=99;
console.log(b); //[99,2,3]

变量保存了基本数据类型的值,而只保存了对引用类型的引用。

5.无用存储单元的收集

由于引用类型没有固定的大小,所以引用类型可能非常的大。由于字符串、数组、对象没有固定大小,所以当知道他们的大小时,才能为他们进行动态的内存分配。

js程序每次创建字符串、对象和数组时,解释器都要分配内存来储存实体,只要像这样动态的分配了内存,最终都要释放内存以便它们能够被再用。否则,js解释器会消耗所有系统内存,造成系统崩溃。

js不要求手动释放内存,它使用一种无用存储单元收集方法。当js检测到一个对象不再使用时,就会把它所占用内存释放掉。

1
2
3
var s = ‘hello’;
var u = s.toUppercase();
s = u;

程序检测到’hello’字符串不再使用,就会释放掉这块内存.

6.作为属性的变量

变量和对象的属性基本是一样的,赋值和用法都相同。

6.1 全局对象

在js解释器执行前,首先要做的事情之一在任何代码执行之前,创建一个全局对象(global object)。这个对象的属性就是全局变量。

当js声明一个全局变量时,实际上就是定义了那个全局对象的一个属性。

在程序的顶层代码中,可以用this代替那个全局对象。
在客户端js中,window对象代表浏览器窗口,是包含在窗口中所有js代码的全局对象。这个全局Window对象具有自我引用的window属性,它代替了this属性。可以用来引用全局对象。Window对象定义了全局的核心属性,例如Infinity,parseInt,Math,除此之外还定义了全局的客户端属性,navigator和 screen.

6.2 局部变量:调用对象

全局变量是特殊的全局对象的属性,局部变量是调用对象(call object)的属性。

在执行一个函数时,局部变量和参数是作为调用对象的属性存储的。用一个完全独立的对象存储局部变量可以使js防止同名变量覆盖全局变量的值。

6.3 javascript的执行环境

javascript的解释器每次开始执行一个函数时,就会为那个函数创建一个执行环境(execution context)。显然,这个执行环境就是js代码段执行时所在环境。

所用js函数都有自己的执行环境,有自己的调用对象,调用对象定义了局部变量。运行不属于任何js代码的环境使用的就是全局对象。

js允许有多个全局执行环境,每个全局执行环境有不同的全局对象(但在在这种情况下,全局对象就不完全是全局的了)。

一个显而易见的例子就是,每个独立的浏览器窗口或同一窗口不同框架中都定义了独立的全局执行环境。每个框架或窗口中的客户端js代码都运行在自己的执行环境中,具有自己的全局对象。但是这些独立的客户端全局对象,具有将其他对象连接起来的属性。因此,一个框架可以通过parent.frames[1]来引用另一个框架的代码,在第二个框架中可以用表达式parent.frames[0].x来引用第一个框架的全局变量x。

7.变量的作用域

变量的作用域