美文网首页
2017-02-26

2017-02-26

作者: 朱小维 | 来源:发表于2017-02-28 15:49 被阅读24次

使用构造函数封装TAB

效果预览

js中的this

本篇文章是读阮一峰的《JavaScript标准参考教程》的学习笔记,文中加入了一些自己的想法,如有侵权,私信我删除

  1. 概述
    this关键字,代表当前的对象环境。其中有两个关键字,一个是“当前”,一个是“对象”。

  2. this的指向是动态改变的
    举个例子:

var A = {
    name:"a",
    sayName:function(){
        return this.name;
    }
}
var B= {
    name:"b"
}
A.sayName();//a
B.sayName = a.sayName;
B.sayName();//b

当把A对象的方法赋值给B对象时,B.sayName()方法的运行环境是B对象,因此this就代表B对象,this.name就等于b了。
总结:JS中一切皆对象,运行环境也是对象,在浏览器环境中顶层对象是window。函数都是运行在某个对象中的,thi指的就是函数当前所在的环境,但是JS中环境会动态切换,这就使得this的指向也是动态改变的。

  1. this的使用场合

    1. 全局环境
      当在全局环境中使用this时,this代表顶层对象window
    this === window//true
    
    
    1. 构造函数
      构造函数中的this指实例对象
    function car(carName){
        this.name = carName;
    }
    var benz = new car("Benz");
    benz.name;//"Benz"
    

    当使用new命令调用构造函数car时,构造函数会自动穿件一个临时对象,并将函数体内部的this替换为临时对象,并对临时对象的属性进行赋值,最后返回临时对象,该临时对象就成为一个实例。因此构造函数中的this就指代实例对象。

    1. 对象的方法
    var benz = {
        name:"Benz",
        sayName:function(){
            console.log(this.name);
        }
    }
    benz.sayName();//"Benz"
    

    这个例子,介绍对象如何在自己的方法里调用自己的属性,sayName方法里的this此时就指代benz对象,前提条件是 通过benz.sayName() 形式调用该方法(直接在benz对象上调用该方法)。

  2. 使用注意点

    1. 避免多层this
    var o = {
      f1: function () {
        console.log(this);
        var f2 = function () {
          console.log(this);
        }();
      }
    }
    o.f1()
    // Object
    // Window
    

    这个例子,o.f1()是通过对象方法的形式调用的,所以其作用对象就是o,this就代表o;而被赋值给f2的立即执行函数是声明完就执行的,即使它是在对象o的内部执行的,但它没有以对象方法的形式执行,所以他的作用对象就是winddow。
    如果想要立即执行函数也log出object,可以按下面的方法:

    var o = {
      f1: function () {
        console.log(this);
        var that = this;
        var f2 = function () {
          console.log(that);
        }();
      }
    }
    o.f1()
    // Object
    // Object
    

    提前用变量将f1中的this存储起来,然后函数中再引用that变量。

    1. 避免数组处理方法中的this
      数组的map和forEach方法,允许提供一个函数作为参数,这个函数内部的this指向调用方法的数组对象。
    var o = {
      v: 'hello',
      p: [ 'a1', 'a2' ],
      f: function f() {
        this.p.forEach(function (item) {
          console.log(this.v + ' ' + item);
        });
      }
    }
    o.f()
    // undefined a1
    // undefined a2
    

    forEach的回调函数内的this指向的是数组对象["a1","a2"],而数组对象并没有属性v。
    解决办法和上面的解决办法相同,就是提前先把对象o的this存储起来。

    var o = {
      v: 'hello',
      p: [ 'a1', 'a2' ],
      f: function f() {
        var that = this;
        this.p.forEach(function (item) {
          console.log(that.v + ' ' + item);
        });
      }
    }
    o.f()
    // hello a1
    // hello a2
    
    1. 避免回调函数中的this
    var o = new object();
    o.f = function() {
        console.log(this === o)
    }
    o.f();//true
    $("#btn").on('click',o.f);
    //当点击btn时返回的是false,因为回调函数的this指向了$("#btn")
    
     这个例子和2中的例子其实是一个意思,都是回调惹的祸。

相关文章

  • 英语口译重点词汇【第三期】

    文/徐小木 2017-02-26 Liberal telecoms regime 宽松的电讯体制 Le...

  • 2017-02-26

    木花如风

  • 2017-02-26

    五年了,林青已经离开这里五年了,不知为何再次来到这里,心里还是有无数的波动…

  • 2017-02-26

    断食第二日 今日主要是清肠,所以今天早餐柠檬水增加到了1.5L ,不能放蜂蜜,盐增加到昨天的三倍。起床时间做的体式...

  • 2017-02-26

    1、正月过完,年味全无了,今天去理了个发,换个造型,整个人瞬间清爽了。 2、物极必反,昨天运动过量,今天懒散洋洋。...

  • 2017-02-26

    总说随缘 随缘 一别永不见 思我情不知所寄 月中天 依旧独思恋 年来年又来 追忆难现

  • 2017-02-26

    开学第一周的周末❤ 努力是一场庞氏骗局。现在努力从来不是为了将来轻松,而是为了更努力而埋下伏笔。斯德哥尔摩患者在面...

  • 2017-02-26

    使用构造函数封装TAB 效果预览 js中的this 本篇文章是读阮一峰的《JavaScript标准参考教程》的学习...

  • 2017-02-26

    激励机制 日本人做事,和我们中国人最大的区别在哪里,日本人很严谨,很细心,而且发挥到极致,在中国历史上,佛教高僧鉴...

  • 2017-02-26

    20170220-26随心而行的践行 这一周的每一天,我都用心去过。 1、早睡早起,除了周六要赶稿,都在设定时间前...

网友评论

      本文标题:2017-02-26

      本文链接:https://www.haomeiwen.com/subject/wrkxgttx.html