日期:2014-05-16  浏览次数:20384 次

请教js中作用域的问题
(1)脚本如下:
注释:脚本引入jquery,block2和block1分别为两个div的id名。

    var obj={
      a:function(){
        block1.innerHTML='+++';//成功执行
        block1.css('background-color','red')//执行失败,错误提示:Object #<HTMLDivElement> has no method 'css'
      }
    };

    function color(){
      var block1=$('#block1');
      $('#block2').bind('click',obj.a);
    };

    color();


(2)问题:
1.js中函数的作用域是在定义时就已经确定,即匿名函数(obj.a)被调用时,在它的作用域链中应该是找不到block1的,当执行block1.innerHTML时应该提示"'block1' is not defined"才对。但是为什么block1.innerHTML却成功执行了?
2.blcok1.innerHTML成功执行是否说明匿名函数(obj.a)的作用域中能找到block1?如果是的话,既然能找到block1,为什么block1不是Jquery对象,却是htmlDivElement对象(即block1.css不能执行)?

------解决方案--------------------


    var obj={
      a:function(){
        block1.innerHTML='+++';//成功执行,这里的block1并不是color中的block1,这里的就 相当于document.getElementById('block1'),直接用ID名算是一种快捷方式,不过有兼容性问题。
        block1.css('background-color','red')//执行失败,错误提示:Object #<HTMLDivElement> has no method 'css'
      }
    };
 
    function color(){
      var block1=$('#block1');
      $('#block2').bind('click',obj.a);
    };
 
    color();

------解决方案--------------------
IE6.可以直接用ID "block1" 表示 dom 对象
------解决方案--------------------
obj中的block1不是function color中的block1,这个你也说了,作用域不同。

obj中的block1只可能是全局作用域中的属性,如楼上所说,这个应该是dom对象block1