代码如下:
<html>
<body>
 <script type="text/javascript">
    
    var a = new Object();
    a.f1=function tt(){
      this.b="hello";
       alert(this.b);
    };
         
    a.f1();
        
    </script>
 </body>
</html>代码可以打印hello。我的问题是,对象a的方法f1中调用了alert方法,我们知道alert是window对象的方法,可是f1并没有window.alert(this.b)这样调用啊, 
按理说,f1中直接写alert(),应该是在查找对象a是否包含此方法,而不是去调用window对象的方法?
上面的代码是什么原因呢?

解决方案 »

  1.   

    可以不写window.的 ,浏览器能识别
      

  2.   

    这个是作用域的问题
    估计楼主把它跟对象的继承搞混了var value = 'test'
    var a = new Object();     a.f1=function tt(){
          this.b="hello"; 
          alert(value); 
        }; 
            
        a.f1(); a.f1中可以直接用变量value,跟a.f1中可以直接用alert方法是一个道理
      

  3.   

    window是JS是内置函数, 可以不写,
      

  4.   

    要在a查找 alert必须写成this.alert当然 a没有alert,报错
    window是默认对象。可以省略
      

  5.   

    alert相当于全局方法 所有对象都可访问 你写  var a=123;
    访问的时候实际是 取 window.a的值 ok了 结贴吧
      

  6.   

    windows 是一个全局对象。
    它的方法也就是全局函数。
      

  7.   

    2楼朋友说的很正确了,是继承问题。
    JS中属性方法的作用域都是靠作用域链实现的
    变量会一级一级的从作用域链往上找,直到找到Window对象
    楼主正好遇到了个特殊情况,就是JS中Window对象可以省略不写的。
      

  8.   

    5楼说对了
    window是顶级对象,是默认的对象。
      

  9.   

    默认情况下,在浏览器中所有Window对象的属性和方法都可以直接调用,而不用写Window。
    楼主可以试试confirm,open等方法就明白了。
      

  10.   

    你需要学习一下作用域链,原型链,构造函数链<body>
    <div id="ee"></div>
    <script>
    function outer(){
    function alert(){
    document.getElementById('ee').innerText = 'alert in inner.';
    }
    function inner(){
    function alert(){
    document.getElementById('ee').innerText = 'alert in inner.';
    }
    alert();
    }
    inner();
    }
    outer();
    </script>
    </body>
      

  11.   

    window是顶级对象,像document、history等等都是window的子对象。或者说是下层对象。
      

  12.   

          this.b="hello"; 
          alert(this.b); 其实是没明白你这段代码的用意。首先你并没有定义任何对象的alert方法,也没对window.alert进行重定义;其次你对this.b赋值然后直接打印出来,那无论this是window还是你定义的对象,这个hello肯定都会打印出来,不会有问题。一开始还以为你是对this指针漂移产生的疑惑,现在没法帮你什么了,我也迷惑了,呵呵,你想问啥~