如图,此代码b1点击后 this 为b1b2点击后 this 为window
 javascript高级编程里说:“关键字this总是指向调用该方法的对象”请问这里为什么b2的点击对应的是window呢?  附代码:   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>    <title></title>    <script language="javascript" type="text/javascript">        function btn_Onclick() {            ;          }            </script></head><body>    <input type="button" onclick="btn_Onclick()" value="aaaaaa" id="b2" name="b2" />    <!-- 此时this为window -->    <input type="button"  value="aaaaaa3333" id="b1" name="b1" />    <script language="javascript" type="text/javascript" >        document.getElementById("b1").onclick = btn_Onclick;        //此时this为控件    </script></body></html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>    <title></title>
    <script language="javascript" type="text/javascript">
        function btn_Onclick() {
            ;
          }            </script></head><body>    <input type="button" onclick="btn_Onclick()" value="aaaaaa" id="b2" name="b2" />    <!-- 此时this为window -->
    <input type="button"  value="aaaaaa3333" id="b1" name="b1" />    <script language="javascript" type="text/javascript" >        document.getElementById("b1").onclick = btn_Onclick;        //此时this为控件    </script></body>
</html>

解决方案 »

  1.   

    你这里的this是默认的this,是指window这个全局对象;要把this当做参数传递到函数里面的时候,this才表示调用该方法的对象;如下:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE> New Document </TITLE>
      <script>
      function test1(obj){
    alert(obj.value);
    alert(this.location.href); //这里的this表示window这个全局对象
      }  function test2(){
    alert(this.location.href);
      }
      </script>
     </HEAD> <BODY>
      <input type="button" value="aaaa" onclick="test1(this);" /> <!--这里的this才表示当前操作的对象 -->
     </BODY>
    </HTML>
      

  2.   

    ie下会有这个问题。
    解决方法是用闭包形式封装this
      

  3.   

    楼上正解,就是当前方法的this一般是传值过去的,直接用this的话可能会是全局的
      

  4.   

    this在英文里是代词,指代的对象由上下文决定,同理,javascript里的this也不是函数定义的时候决定的,而是函数被调用的时候决定,如果函数说为任何对象的方法被调用,则this指对象,b1的方式,函数被绑定到b1的onclick方法,是作为b1的方法被调用,所以,this是指b1,而b2里其实可以这样写,加个分号:
     onclick="btn_onclick();"
    也就是说,btn_onclick()并不是b2的方法,而是b2的onclick方法里的一句调用代码,所以这时其this不能指b2,js规定,函数不作为任何对象的方法被调用的时候,是指window。