Zydecx's Site

Debug code, debug life, debug today!

JavaScript变量

Time: , by zydecx

在JavaScript中定义变量

如下所示,定义变量message,并赋值"hi"

var message = "hi";

其中,关键字var可省略,即直接通过message = "hi";定义变量,但这种方式不推荐使用(该问题会在全局变量与局部变量中再讨论)。

此外,也可以通过下面的方式一次定义多个变量。

var message = "hi",
    name = "john",
    age = 20,
    sex;    // typeof sex = 'undefined'

JavaScript变量为松散类型

所谓松散类型,即一个变量可以保存任何类型的数据,比如下面这种方式是可以的(但不推荐使用)。

var message = "hi"; // typeof message = 'string'
message = 20;   // typeof message = 'number'

需要强调一点,松散类型仅仅只变量可以保存任何类型数据,但变量本身是有类型的(如上例中的注释所示)。变量未附任何值时,其类型为undefined

全局变量与局部变量

在函数中使用var定义的变量为局部变量,否则为全局变量。局部变量会在函数退出时销毁。

举个例子,下面这段程序,message是在testFunc函数中定义的局部变量,只能在函数内访问;函数退出后再访问这个变量,则会报ReferenceError错误。与此相反,globalMessage是全局变量,不仅可以在函数内访问,在函数内的修改也会反应到全局中。

var globalMessage = "hello";
function testFunc() {
    var message = "hi";
    alert(message); // ="hi"
    alert(globalMessage);   // ="hello"
    globalMessage = "hello from function";
}
testFunc();
alert(message); // [ERROR]ReferenceError: message is not defined        
alert(globalMessage);   // ="hello from function"

前面说过,定义变量时,关键字var可以省略,这时候,变量就会变成全局变量,即便它是在函数中定义。如下面的例子所示。但这种方式不推荐使用,一是不便于对全局变量进行维护;二是在严格模式下不支持,会报ReferenceError错误;三是由于JavaScript变量初始化顺序的问题,可能导致一些未知的错误,这个问题后续会有专门的文章来介绍。

function testFunc() {
    message = "hi";
}
testFunc();
alert(message); // ="hi"

This is a magic phrase. You CANNOT see it(I'll really FULE you if you do that), but it does work. Why? You may feel confused. OK, at least it doesn't afftect your experience and it works. That is what we call MAGICE!