Javascript的变量只有全局作用域和函数作用域,没有其它语言中常见的块作用域,也就是在()和{}作用域中的变量。变量从其声明(var myVar)或首次赋值(此前未声明)之处起开始处进入其生命期。有些文章认为在Javascript函数中,变量即用即声明是bad practice,因为只要在函数中任意地方声明了某个变量,该变量即在函数开头处就进入了其生命期,因此best practice是前向声明。但是下面代码的运行结果(在firebug中)显示变量仍然是从其声明处进入生命期的。

function sayHi2(){
    console.log(myVar); //this line will comlain myVar is not defined
    var myVar = 20;
    console.log("after:" + myVar);
    }
     
    sayHi2();



通过下面两种方式产生一个全局作用域的变量:

1. 在任何函数体之外通过var关键字声明的变量;

2. 在任何地方(函数体内或者函数体外),对一个从未声明过的标识符赋值,从而使其成为一个变量。

全局变量实际上是宿主对象的成员变量。比如在浏览器环境下,全局变量myVar实际上等于window.myVar。

构造函数中的变量

Javascript中的构造函数并没有特别的形式和限定。一般程序员会将一个函数名的首字母置为大写,如果他想将该函数当作构造函数使用的话。下面是构造函数一例:

var Person = function() {

    var a = 0; //声明了一个局部变量,在构造函数外任何地方都无法使用它
    b = 1; //产生了一个全局变量
    this.c = 2; //产生了一个成员变量
    this.funcA = function(){console.log("funcA");}; //成员函数
    function funcB(){ //函数也是对象。因此,这个定义实际上声明了一个局部变量,构造函数以外任何地方都无法引用它
    console.log("funcB");
    }
    };
     
    var p = new Person ();
    console.dir(p)
    function foo() {
    foo.counter = foo.counter || 0; // 将计数器初始化为0
    foo.counter++;
     
    console.log(foo.counter);
    }
     
    for (var i = 0; i <=5; i++){
    foo();
    }
    function foo() {
    foo.counter = foo.counter || 0; // 将计数器初始化为0
    foo.counter++;
     
    console.log(foo.counter);
    }
     
    for (var i = 0; i <=5; i++){
    foo();
    }
    function foo() {
    arguments.callee.counter = arguments.callee.counter || 0; // 将计数器初始化为0
    arguments.callee.counter++;
     
    console.log(arguments.callee.counter);
    }
     
    for (var i = 0; i <=5; i++){
    foo();
    }
    var my = {
    init : function(){
    console.log(this);
    if (typeof this._done_ != 'undefined'){
    console.log("already inited.");
    }else{
    console.log("not inited.");
    this._done_ = true;
    }
    }
    }
    my.init();
    my.init();
    var my = {
    mem : "hello",
    msg : this.mem + " world!"
    };
    console.log(my.msg);
var my= {
    home : "http://home",
    jsdir: my.home + "/js",
    init : function(){
        console.log("init");
    },

    start : function(){
        console.log("start");
        my.init();
    }
};

my.start();