美文网首页
JS学习笔记之this指向

JS学习笔记之this指向

作者: 雪人苏苏_ | 来源:发表于2018-05-10 22:43 被阅读0次

初学JS的朋友可能对this指向问题有些困惑。最近在看《Javascript设计模式与开发实践》一书,里面总结得很到位。梳理下大致可以分为4情况,有兴趣的可以自行去翻书阅读。

作为对象的方法调用

作为普通函数调用

构造器调用

Function.prototype.call和Function.prototype.apply调用

1、作为对象的方法调用

当函数作为对象的方法被调用时,此时this指向该对象。

var obj = {
     name: lq,
     getName: function () {
        console.log (this === obj); // true
        console.log (this.name); // lq
     }
 }

2、作为普通函数调用

当函数不作为对象属性被调用,而是通过普通的函数调用,此时的this总是指向全局对象。在浏览器环境的JavaScript里,就是window对象。

 window.name = 'lq';
 let getName = function () {
     return this.name;
 }
 console.log ( getName() ); // 输出:lq 此时this指向window对象

又比如:

 window.name = 'lq';
 let myObj = {
     name: 'xiaoming',
     getName: function () {
         return this.name; 
     }
 };
 
 let getName = myObj.getName;
 console.log ( getName() ); // 输出:lq 

有时候在我们点击div节点的事件函数内部,如果有一个callback回调函数,当callback被当作普通函数调用时,callback内部的this指向window,但实际上我们想让它指向被点击的div节点本身。代码如下:

 <html>
    <body>
        <div id='div1'>my is div node</div>
    </body>
    <script>
        window.id = 'window';
        document.querySelector('#div1').onclick = function () {
            console.log (this.id); // 输出:div1 
            let callback = function () {
                console.log (this.id); // 输出:window
            }
            callback();
        }
    </script>
 </html>    
    

通常的解决方法是用一个变量来保存div节点的引用:

 document.querySelector('#div1').onclick = function () {
     let _this = this;
     let callback = function () {
         console.log (_this.id); //输出:div1
     }
     callback();
 }

另外,在ESMAScript5下的strict严格模式下,这种普通函数调用已经被规定为不会指向全局对象,而是undefined。

 function fun () {
     'use strict'
     console.log (this); //输出了:undefined
 }
 fun();

3、构造器调用

Javascript种没有类的概念,但提供了new运算符,这样我们可以从构造器中创建对象。除了宿主提供的一些内置函数,大部分的Javascript函数可以当作构造器使用。构造器跟普通函数没什么太大区别,唯一的区别是被调用的方式。

当用new运算符调用函数时,该函数会返回一个对象,一般情况下,构造器里的this都指向返回的这个对象。如下:

 let myObj = function () {
     this.name = 'lq';
 };
 
 let obj = new myObj();
 console.log (obj.name); //输出:lq

如果new构造器显式地返回一个object类型的对象,那么运算的结果就会最终返回这个对象,this就不是我们之前所期望的this了。如下:

 let myObj = function () {
     this.name = 'lq';
     return {
        name: 'xiaoming';   
     }
 }
 let obj = new myObj();
 console.log(obj.name); // 输出:xiaoming 

如果构造器返回的不是object类型的对象,而是一个非对象类型的数据,就没有上面的问题。

let myObj = function () {
    this.name = 'lq';
    return 'xiaoming';
};
let obj = new myObj();
console.log (obj.name); //输出:lq

4、Function.prototype.call和Function.prototype.apply调用

这两种方式调用可以动态地改变传入函数的this:

 let obj1 = {
     name: 'lq',
     getName: function () {
         return this.name;
     }
 };
 let obj2 = {
     name: 'xiaoming'
 };
 console.log (obj1.getName()); //输出:lq
 console.log (obj1.getName.call(obj2)); // 输出:xiaoming
 console.log (obj1.getName.apply(obj2)); //输出:xiaoming
 

相关文章

  • JS学习笔记之this指向

    初学JS的朋友可能对this指向问题有些困惑。最近在看《Javascript设计模式与开发实践》一书,里面总结得很...

  • js之this指向问题

    结果如下。一开始有点迷惑,success不是属于myMessage对象的一个属性吗?为什么this不是指向myMe...

  • JS之this指向问题

    描述 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,一般情况下this...

  • 杂记

    有C,OC,JS,有面试题,有笔记,有学习知识,不系统,很杂 Node.js最新技术栈之Promise篇

  • JavaScript ☞ day1

    JavaScript基础学习笔记之JavaScript基础 HTML中添加JS代码、注释方法、输出方式 docum...

  • JavaScript ☞ day4

    JavaScript基础学习笔记之轮播 轮播效果: index.html文件内容 loog.js文件内容 styl...

  • JS this指向

    一、js中的四种调用模式s 构造函数调用:new Foo(); 对象方法调用:o.method(); 函数直接调用...

  • js this指向

    this指向调用该函数的对象 在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不...

  • JS this指向

    首先,请牢记以下三点1. this指向的,只可能是对象!2.this指向谁,不取决于this写在哪!而是取决于函数...

  • JS this指向

网友评论

      本文标题:JS学习笔记之this指向

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