zoukankan      html  css  js  c++  java
  • this的九种常用场景(转子jb51.net)

    【场景1】全局环境中的this指向全局对象

    this.a = 10;
    alert(a);//10
    b = 20;
    alert(this.b);//20
    var c = 30;

    【场景2】对象内部函数的this指向调用函数的当前对象

    var a = 10;
    var bar = {
     a: 20,
     test: function(){
      alert(this.a);
     }
    }
    bar.test();//20

    【场景3】全局环境函数的this指向全局对象

    var a = 10;
    function foo(){
     alert(this.a);
    }
    foo();//10

    【场景4】匿名函数中的this指向全局对象

    var a = 10;
    var foo = {
     a: 20,
     fn: (function(){
      alert(this.a);
     })()
    }
    foo.fn//10

    【场景5】setInterval和setTimeout定时器中的this指向全局对象

    var a = 10;
    var oTimer1 = setInterval(function(){
     var a = 20;
     alert(this.a);//10
     clearInterval(oTimer1);
    },100);

    【场景6】eval中的this指向调用上下文中的this

    (function(){
     eval("alert(this)");//[object Window]
    })();
    function Foo(){
     this.bar = function(){
      eval("alert(this)");//[object Object]
     }
    }
    var foo = new Foo();
    foo.bar();

    【场景7】构造函数中的this指向构造出的新对象

    function Person(name,age){
     this.name = name;
     this.age = age;
     this.sayName = function(){
      alert(this.name);
     }
    }
    var p1 = new Person('lily','20');
    p1.sayName();//'lily'

    【场景8】new Function中的this指向绑定或调用对象

    (function(){
     var f = new Function("alert(this)");
     f();//[object Window]
    })();
    function Foo(){
     this.bar = function(){
      var f = new Function("alert(this)");
      f();//[object Window]
     }
    }
    var foo = new Foo();
    foo.bar();
    以上指向全局。
    var obj = {
      name : "江太公",
      sex : "",
      action : new Function("console.log(this)")
    }
    
    obj.action();
    2017-01-20 11:07:45.684 VM4742:2 
    Object {name: "江太公", sex: ""}
    以上指向调用对象。

    【场景9】apply和call中的this指向参数中的对象

    var a = 10;
    var foo = {
     a: 20,
     fn: function(){
      alert(this.a);
     }
    };
    var bar ={
     a: 30
    }
    foo.fn.apply();//10(若参数为空,默认指向全局对象)
    foo.fn.apply(foo);//20
    foo.fn.apply(bar);//30

    【复合场景1】

    var someone = {
     name: "Bob",
     showName: function(){
      alert(this.name);
     }
    };
    var other = {
     name: "Tom",
     showName: someone.showName
    }
    other.showName();  //Tom
     
    //以上函数相当于
     
    var other = {
     name: "Tom",
     showName: function(){
      alert(this.name);
     }
    }
    other.showName();  //Tom

    【复合场景2】

    var name = 2;
    var a = {
     name: 3,
     fn: (function(){
      alert(this.name);
     })(),
     fn1:function(){
      alert(this.name);
     }
    }
    a.fn;//2[匿名函数中的this指向全局对象]
    a.fn1();//3[对象内部函数的this指向调用函数的当前对象]

    【复合场景3】

    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=this改变this的指向,使this从指向全局变量变化到指向nameObj]
     
    var name = "Bob"; 
    var nameObj ={ 
     name : "Tom", 
     showName : function(){ 
      alert(this.name); 
     }, 
     waitShowName : function(){
      var that = this;//that指向nameObj
      setTimeout(function(){
       (function(){ 
        alert(this.name);
       })();
      }, 1000);
     }
    }; 
    nameObj.waitShowName();// 'Bob'[形成匿名函数,this指向全局变量]

    补充:

    DOM事件处理函数中的 this

    当函数被用作事件处理函数时,它的this指向触发事件的元素(一些浏览器在动态添加监听器时不遵守这个约定,除非使用addEventListener 这句不太确定翻译的是否正确)。

    // 被调用时,将关联的元素变成蓝色
    function bluify(e){
      console.log(this === e.currentTarget); // 总是 true
    
      // 当 currentTarget 和 target 是同一个对象是为 true
      console.log(this === e.target);        
      this.style.backgroundColor = '#A5D9F3';
    }
    
    // 获取文档中的所有元素的列表
    var elements = document.getElementsByTagName('*');
    
    // 将bluify作为元素的点击监听函数,当元素被点击时,就会变成蓝色
    for(var i=0 ; i<elements.length ; i++){
      elements[i].addEventListener('click', bluify, false);
    }

    内联事件处理函数中的 this

    当代码被内联处理函数调用时,它的this指向监听器所在的DOM元素:

    <button onclick="alert(this.tagName.toLowerCase());">
      Show this
    </button>
    

    上面的alert会显示button。注意只有外层代码中的this是这样设置的:

    <button onclick="alert((function(){return this})());">
      Show inner this
    </button>
    

    在这种情况下,没有设置内部函数的 this,所以它指向 global/window 对象(即非严格模式下调用的函数未设置 this 时指向的默认对象)。

     
    Regex
    Hide network messages
    • All
     
    • Errors
    • Warnings
    • Info
    • Logs
    • Debug
    • Handled
     
    var obj = { name : "江太公", sex : "男", action : new Function("console.log(this)") } obj.action();
    2017-01-20 11:07:45.684 VM4742:2
    1. Object {name"江太公"sex"男"}
  • 相关阅读:
    选择学习Web前端开发的理由
    在Nginx下部署SSL证书并重定向至HTTPS
    使用pm2快速将项目部署到远程服务器
    DNS域名解析过程
    HTML5新特性总结
    基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块
    react中使用css的7种方式
    原生JS实现滑动轮播图
    H5与企业微信jssdk集成
    img图片不存在显示默认图
  • 原文地址:https://www.cnblogs.com/jiangtian/p/6322309.html
Copyright © 2011-2022 走看看