javascript中变量做用域的一点小思考

部门技术交流中学习了这篇文章:javascript

深刻理解JavaScript的变量做用域html

的确是一篇很不错的文章。回来再琢磨了一下,以为有两点是要重点注意的:java

1. javascript中没有block级做用域,但有函数级做用域函数

2. JS引擎执行函数的时候,会首先根据函数体内的变量声明(注意不是定义)分配变量的内存资源,无论这些变量声明的位置。而当遇到和函数做用域外名称相同的变量,中函数内部会覆盖掉函数做用域外的变量学习

对于第一点,引用原文的示例代码作一点点改动:spa

<script type="text/javascript">  
    function rainman(){  
        // rainman函数体内存在三个局部变量 i j k  
        var i = 0;  
        if ( 1 ) {  
            var j = 0;  
            for(var k = 0; k < 3; k++) {  
                alert( k );    //分别弹出 0 1 2  
            }  
            alert( k );        //弹出3  
        }  
        alert( j );            //弹出0  
    }
rainman();
alert(i);    
</script>  

rainman中的i,j,k能够正常输出,由于它们都在函数rainman中定义的,在函数内都是可用的。
但最后一个alert(i)则会出现脚本运行错误!由于超出了rainman的做用域,i变得不可用!因此说JS是有函数级做用域,但没有block级做用域!code

有意思的是第二点。htm

再一次,引用原文的代码:blog

<script type="text/javascript">  
    var x = 1;  
    function rain(){  
        alert( x );        //弹出 'undefined',而不是1  
        var x = 'rain-man';  
        alert( x );        //弹出 'rain-man'  
    }  
    rain();  
</script> 

为什么第一个alert弹出的是undefined???
个人理解是,JS引擎执行函数的时候,会首先根据函数体内的变量声明(注意不是定义!)分配了函数体内所用的变量内存资源,无论这些变量声明的位置是在开头仍是结束!ip

由这个例子进一步,若是var x='rain-man'是有条件的去执行的,JS引擎还会不管如何都先给x分配资源吗??看代码:

<script type="text/javascript">  
    var x = 1;  
    function rain(){  
        alert( x );        //弹出 'undefined',而不是1  
        if(0)
            var x = 'rain-man';  
        alert( x );        //弹出 'undefined'  
    }  
    rain();  
</script> 

答案是确定的。即便分支不会走到,JS引擎仍是不管如何都给x先分配了内存!而一如既往的是,函数内部的x会在函数内部的做用域中覆盖掉外部的x。

相关文章
相关标签/搜索