费解的javascript作用域

在编程语言中,作用域控制着变量的可见性及生命周期。对程序员来说这是一个重要的帮助,因为它减少了命名冲突,并且提供了自动内存管理。

function fengshu() {
    // 函数体内存在三个局部变量 i j k
    var i = 0;
    if (i === 0) {
        var j = 10;
        for (var k = 0; k < 3; k++) {
            console.log(k); // 0 1 2
        }
        console.log(k); // 3
    }
    console.log(j); //10
}



大多数使用c语言语法的语言都拥有块级作用域,在一个代码块中(括在一对花括号中的语句集)定义的所有变量在代码块的外部是不可见的定义在代码块中的变量在代码块执行结束后被释放掉,这是件好事。

糟糕的是,尽管代码块的语法是否表现出它支持块级作用域,但实际上javascript并不支持,这个混淆之处可能成为错误之源。

javascript确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数的任何地方都可见。

很多现代语言都推荐尽可能迟地声明变量。而且在javascript上的话却会成为糟糕的建议,因为它缺少块级作用域。所以最好的办法是在函数体的顶部声明函数中可能用到的所有变量。


所以,从javascript 作用域得出的结果是javascript有函数作用域,但并没有所谓的块级作用域。

你可能感兴趣的:(JavaScript,作用域)