zoukankan      html  css  js  c++  java
  • javascript中的this指向问题

     

    This关键字:

    1、this指向调用该函数的对象

    通常情况下,定义一个变量、一个函数,都是作为window的属性、方法的

    Var info=’hello’;

    Function sayhi(){ 

    This.style.color=’red’;

    }

    全局变量info  其实是window.info=’hello’;

    调用sayhi() 其实是window对象在调用,即window.sayhi() 通常情况下省略window,直接调用。所以this.style.color中的this指向的是window

     

    2、通过new关键字实例化时,改变this指向,不在指向window。而是指向实例化的这个对象。

    示例:

    Function Student(){

    This.name=”lydia”;

    }

    Var stu=new Student();

    此时 this指向stu

     

    3、匿名函数具有全局性,因此在匿名函数中this指向window对象

     

    Var name=’outer’;

    Var obj={

    name:’inner’,

    Say: function (){

    Alert(this.name);  //inner  this指向调用它所在函数的那个对象 即obj

     

    (Function (){

    Console.log(this.name);  //outer  this指向window

    }());

    }

    }

    Obj.say();

     

    var name = "window";
    
    var Bob = {
        name: "Bob",
        showName: function(){
            alert(this.name);
        }
    };
    
    var Tom = {
        name: "Tom",
        showName: function(){
            var fun = Bob.showName;
            fun();
        }
    };
    
    Tom.showName();  //window

    4、在事件监听中this指向调用该监听事件的对象

    ele.addEventListener(‘click’,handler,false);

    或者 ele.onclick=handler;

    Function handler(){

      this.style.color=’green’;    //this指向绑定事件时的元素ele

    }

    This被解析为将函数作为其方法的对象

    挑战题:

    1、

    var name = "Bob";  
    var nameObj ={  
        name : "Tom",  
        showName : function(){  
            alert(this.name);  
        },  
        waitShowName : function(){
            var that = this;
            setTimeout(function(){                
                that.showName();
            }, 1000);
        }
    };  
     nameObj.waitShowName();  

    2、

    var name = "Bob";  
    var nameObj ={  
        name : "Tom",  
        showName : function(){  
            alert(this.name);  
        },  
        waitShowName : function(){
            var that = this;
            setTimeout("that.showName();", 1000);
        }
    }; 
     
    nameObj.waitShowName();  

    3、

    var fun = new Function("alert(this)");  
    fun();

    答案:1、Tom    2、报错: “that is not defined”       3、[object Window]

    1、中由于在定时器中使用的是一个函数,因此在函数定义时,是可以读取到that变量的。 个人理解:类似于闭包,可以读取外面的变量,所以可以读取that

    setTimeout(function(){         //在执行该函数时,此处 this指向window 而that指向的是nameObj对象 
                that.showName();
            }, 1000);
    2、由于使用的是一个字符串,需要先用eval执行,解析成函数,再执行,而这一过程发生在定时器指定的时间间隔后,因此,在使用eval解析后的函数中,this实际已经指向window,而that是不存在的变量,所以会提示 “that is not defined”
  • 相关阅读:
    job owner的权限和sql agent start account权限在job调用和job执行的各个阶段起什么作用?
    【转帖】SharePoint 2010中的沙盒解决方案(Sandboxed Solution)
    [ZT]使用IIS作为宿主的WCF服务出现HTTP Error 404.3 Not Found错误的解决办法
    [zt]SharePoint Calculate date column 日期计算列(20100916 23:04:14)
    PortalSiteMapProvider was unable to fetch children for node
    [ZT]SharePoint列表导入/导出命令 SharePoint列表导入/导出命令
    [ZT]一个女IT民工的梦
    “System.Collections.Generic.IEnumerable<TestDAL.HistoryData>”不包含“ToList”的定义
    C#生成随机序列
    利用C#线程窗口调试多线程程序
  • 原文地址:https://www.cnblogs.com/lydialee/p/3992214.html
Copyright © 2011-2022 走看看