js中变量作用域问题

本文内容由http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html该作者博客内容整理总结部分内容而得

一、js调用变量的内部流程

看下面这段代码:

<script type="text/javascript">
    var rain = 1;
    function rainman(){
        var man = 2;
        function inner(){
            var innerVar = 4;
            alert(rain);
        }
        inner();    //调用inner函数
    }
    rainman();    //调用rainman函数
</script>

观察alert(rain);这句代码。JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出'1'。

二、js没有块级作用域

什么意思?也就是说他不像java一样,在for循环中定义的变量,就只能在for循环中用,在条件语句中定义的局部变量,就只能在if块中用。在for中,在if中定义的局部变量,在函数体内都是全局的。

<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
    }
</script>


在上面这段代码中,i,j,k的作用域都是一样的。

三、未声明var的变量皆为全局变量

即该变量都是window的属性。

<script type="text/javascript">
    var x = 100 ;
    alert( window.x );//弹出100
    alert(x);
</script>

这段代码等同于
<script type="text/javascript">
    window.x = 100;
    alert( window.x );
    alert(x)
</script>




你可能感兴趣的:(js中变量作用域问题)