JS中this的指向

作者: 常开洋 | 来源:发表于2017-08-21 03:34 被阅读0次

    大家好,我是IT修真院成都分院第一期的学员常开洋,一枚正直纯洁善良的web前端程序员

    今天给大家分享一下,修真院官网JS(职业)任务,

    深度思考中的知识点——JS中this的指向

    大家好,我是IT修真院成都分院第一期的学员常开洋,一枚正直纯洁善良的web前端程序员

    1.背景介绍

    this是什么?

    this最开始起源于C#,当做右指针来用的只能在class,struct, 和union类型中的非静态成员函数/函数模版class指针访问, 指向被调成员所属的对象。静态成员中无法使用this指针。在js中,同样也是关键字,它代表函数运行时, 自动生成的一个函数内部对象,只能在函数内部使用

    2.知识剖析

    this主要有4方面的应用

    1.默认绑定到全局变量

    function demo1(){

    console.log(this.c);

    }

    var c=2;

    demo1();//2

    2.隐式绑定(也称隐式调用)是指函数调用的时候属于某个对象,比如说

    function demo2(){

    console.log(this.a);

    }

    var obj={

    a:5,

    demo2:demo2

    }

    var a=15;

    obj.demo2();//5

    如果在这过程中出现带有this的函数被引用,可能会是全局变量

    function demo3(){

    console.log(this.a);

    }

    var obj={

    a:5,

    demo:demo3

    }

    var b=obj.demo;//函数引用传递

    var a="abc";

    b();//abc

    3.显示绑定 学过bind()\apply()\call()函数的都应该知道,它接收的第一个参数就是将上下文的对象赋给this,看这个demo

    function demo4(){

    console.log(this.a);

    }

    var obj={

    a:2

    }

    demo4.call(obj);//2

    如果我们传递的第一个值是简单值的话,那么后台会自动转化为对应的封装对象,如果传递为null,那么结果就默认绑定到全局变量

    function demo5(){

    console.log(this.a);

    }

    var obj={

    a:10

    }

    var a=2;

    demo5.call(null);//2

    4.new新对象绑定 如果是一个构造函数,则需要使用new来调用,那么绑定的将是新创建的对象。

    function demo5(a){

    this.a=a;

    }

    var obj=new demo5(2);

    var a=10;

    console.log(obj.a);//2

    3.常见问题

    关于很多人对于this使用的误解

    相信有些人在其他语言中接触过this,会将this误解为引用function本身,下面我举个例子看看到底是不是这样

    function demo6(num){

    this.count++;

    }

    demo6.count=0;

    for(var i=0;i<10;i++){

    if(i>5){

    demo6(i);

    }

    }

    console.log(demo6.count);//结果是0,为什么不是4?

    4.解决方案

    其实在上面这个demo6中的this指的是一个全局对象,所以this.count并没有定义,更别说赋值了,如果这时候要打印this.count的话,只能为NaN了。 但是如果给count定义并赋值为0,则this.count最终结果为4;

    function demo6(num){

    this.count++;

    console.log(this.count);//1,2,3,4

    }

    demo6.count=0;var count=0;

    for(var i=0;i<10;i++){

    if(i>5){

    demo6(i);

    }

    }

    console.log(demo6.count);

    5.编码实战

    6.扩展思考

    说了那么多this方面的知识,那么this到底有哪方面的应用?

    随着代码的增加,函数嵌套、各级调用等变得越来越复杂,那么传递一个对象的引用将变得越来越不明智,它会把你的代码弄得非常乱,甚至你自己都无法理解清楚。而this机制提供了一个更加优雅而灵便的方案,传递一个隐式的对象引用让代码变得更加简洁和复用。

    7.参考文献

    参考一:别再为this发愁了----js中的this机制

    8.更多讨论

    如果this应用在严格模式(use strict)中,上面提到的this指向哪些不能使用?

    如果在严格模式的情况下执行纯粹的函数调用,那么这里的的 `this` 并不会指向全局,而是 `undefined`,这样的做法是为了消除 js 中一些不严谨的行为

    'use strict';

    function test() {

    console.log(this.a);

    };

    var a=2;

    小课堂视频链接:https://v.qq.com/x/page/m0540rtxyl4.html

    下期不见不散~

    今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

    test();//严格模式下会报错,正常模式下为2

    相关文章

      网友评论

        本文标题:JS中this的指向

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