zoukankan      html  css  js  c++  java
  • this的指向

    参考地址:http://home.cnblogs.com/group/topic/69994.html

    例1:因为下面有个定时器,所有指向的是全局的,setTimeout 无论在哪里,this指的都是window

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

    如果想获取的名称为Tom,代码应该如下: 

    在执行nameObj.waitShowName函数时,我们先对其this赋给变量that(这是为了避免setTimeout中的匿名函数运行时,

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

    ),然后延迟运行匿名函数,执行that.showName,即nameObj.showName 

    例2:

    var someone = {
      name: "Bob",
      showName: function(){
        alert(this.name);
      }
    };
    
    var other = {
      name: "Tom",
      showName: someone.showName     //这句话等价于:showName:  function(){alert(this.name);}  这里的函数来自someone.showName, 所以this指的是当前other
    }
    
    other.showName();  //Tom
    

      

    例3:

    var name = "Tom";
    
    var Bob = {
    
      name: "Bob",
      show: function(){
        alert(this.name);
      }
    }
    
    var show = Bob.show;        //这句话等价于:var show =  function(){alert(this.name);}  这里的函数来自BOb.show, 所以this指的是window 
    
    show();            //Tom
    

      

    例4:

    var name = "window";
    
    var Bob = {
      name: "Bob",
      showName: function(){
        alert(this.name);
      }
    };
    
    var Tom = {
      name: "Tom",
      showName: function(){
        var fun = Bob.showName;     //这句话等价于:var fun =  function(){alert(this.name);}  这里的函数来自BOb.showName, 因为这里重新var 了fun,所以作用域链已经断掉,重新指向了window
        fun();
      }
    };
    
    Tom.showName();  //window
    

      

     例5:eval函数,其执行时候似乎没有指定当前对象,但实际上其this并非指向window,因为该函数执行时的作用域是当前作用域,即等同于在该行将里面的代码填进去

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

      
  • 相关阅读:
    (转)值得学习百度开源70+项目
    C#中$的用法
    (转载)《C#高级编程》读书笔记
    C#调用大漠插件
    Visual Studio 2017 扩展推荐
    C#操作Dataset数据集与SQLite数据库
    (转载)C#格式规范
    (转载)DataTable与List<T>相互转换
    FastReport.Net
    (转载)C #开源框架
  • 原文地址:https://www.cnblogs.com/vivijs/p/3729782.html
Copyright © 2011-2022 走看看