首页 > 技术文章 > JS中不存在块级作用域

chenqiushi 2015-03-26 22:54 原文

与C C++ JAVA不同,Javascript中没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有定义的。如以下例子中,i,j,k的作用域是相同的,它们三个在整个函数体中都有定义:

    function test(o){
        var i = 0;            //i在整个函数体内都有定义
        if(typeof o == 'object'){
            var j = 0;      //j也是,不仅在括号内
            for(var k = 0;k < 10;k++){  //k也是,不仅在循环内部
                document.write(k);
            }
            document.write(k);        //k 仍有定义  输出10
        }
        document.write(j);           // j也有定义
    }

注意 “有定义”和”初始化“的区别:

    var a = 'global';
    function demo(){
        console.log(a); // undefined 而不是global
        var a = 'local';  //变量在此初始化,但到处都有定义
        console.log(a);  //local
    }
    demo();

以上函数和下面等价:

    var a = 'global';
    function demo(){
        var a;       //局部变量在函数开头声明
        console.log(a);  //此处该变量有定义,但未初始化(赋值),仍为undefined
        a = 'local';  //初始化赋值
        console.log(a); //local
    }
    demo();

这就是javascript提前声明的特性。虽然局部变量在整个函数体内都是有定义的,但是在执行var之前,它是不会初始化的。

 

这个例子说明了为什么将所有的变量声明集中起来放置在函数的开头是一个好的编程习惯。

推荐阅读