<script type="text/javascript">
    function checkscope(d) {
        var i = 0;
        if (typeof d == "object") {
            var j = 0;
            for (var k = 0; k < 10; k++) {
                document.write(k);
            }
            document.write(k);
        }
        document.write(j);
    }
    checkscope("精华");
</script>这段代码,运行之后,为什么输出的是一个undefined呢?k的值0---9应该输出吧,j的值也应该输出0啊,为什么呢?

解决方案 »

  1.   

        function checkscope(d) {
            var i = 0;
            if (typeof d == "object") {//这个不成立,所以没有执行j=0赋值操作,但是if没有作用域,var申明的j预编译已经生成,为undefined
                var j = 0;
                for (var k = 0; k < 10; k++) {
                    document.write(k);
                }
                document.write(k);
            }
            document.write(j);
        }
        checkscope("精华");你的代码等价于下面
        function checkscope(d) {
            var i = 0;
            var j/////
            if (typeof d == "object") {
                vj = 0;
                for (var k = 0; k < 10; k++) {
                    document.write(k);
                }
                document.write(k);
            }
            document.write(j);
        }
        checkscope("精华");
      

  2.   

    typeof(d)为 string 
    if后面的压根就没执行
    直接执行document.write(j);
    j在哪里定义的?不输出undefined输出什么?
      

  3.   

    所以,学了c#,学JS,真的想发吐,明明if块没有执行,还是定义了变量j
      

  4.   


    《JS权威指南》说的:函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有定义的...
    那么,变量k和j都应该输出undefined吧,为什么只输出一个undefined
      

  5.   

    #2已经说了typeof d等到的结果是string,和object对比肯定不对了,所以没执行j=0赋值操作,是undefined,你看我发的第二个代码就清楚了,只执行了最后的一个 document.write(j);语句
      

  6.   

    "精华" 是 string只执行了 document.write(j);
    j 未赋值
      

  7.   

    if没执行 里面的document.write(k)等于废了 咋输出?
      

  8.   

    肯定是undefined 。根本不会进if  你传的“精华”并不是object
      

  9.   

    同意只输出一个j的undefined 
      

  10.   

    typeof d == "object"
    这样的用法不太常见
    一般都是
    if(d)就可以
    或者if(!!d)
    就可以判断d是否为空了