最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 浅谈JavaScript中this的指向问题及面试题

    正文概述 掘金(BrightestStar)   2021-02-21   544

    写在前面

    this 作为JavaScript中的一个关键字,它的复杂度很高,主要原因是它所处不同场景的代表的指向是不一样的。这里先做一个结论,重要事情说三遍:

    this的指向是由上下文环境动态决定的

    this的指向是由上下文环境动态决定的

    this的指向是由上下文环境动态决定的

    this指向实例场景

    关于this的指向的不确定性,主要体现在如下几个应用场景中:

    • 全局环境
    • 普通函数调用
    • call/apply/bind函数调用
    • 对象属性方法调用
    • 构造函数调用
    • 箭头函数

    全局环境

    在全局环境中无论是否是严格模式,this 均指向全局对象,例如浏览器端的 window

    // 在浏览器中, window 对象同时也是全局对象:
    console.log(this === window); // true
    
    a = 37;
    console.log(window.a); // 37
    
    this.b = "MDN";
    console.log(window.b)  // "MDN"
    console.log(b)         // "MDN"
    

    普通函数调用

    当普通的函数,直接调用的时候,一般来说分两种情况:

    • 严格模式绑定到 undefined
    • 非严格模式绑定到全局对象 window
    function foo(){
      console.log(this);  
    }
    function bar(){
      "use strict"; 
      console.log(this);
    }
    foo() // window
    bar() // undefined
    

    call/apply/bind函数调用

    call/apply 这两个函数对象到方法能立即执行某个函数,并且讲函数中的this绑定到你提供到对象上去

    bind 方法永久的绑定函数中的this到指定对象上,并返回一个新函数,将来这个函数无论怎么调用都可以

    function foo(){
      console.log(this);  
    }
    function bar(){
      console.log(this);
    }
    foo.call({name:'小米'}); // {name: "小米"}
    
    const bar1 = bar.bind({num:123})
    bar1() // {num: 123}
    

    对象属性方法调用

    作为对象属性方法调用,都指向前面调用函数都那个对象。当然有的时候会出现各种变种或者干扰的面试题

    const student = {
      name: "tom",
    
      fn: function () {
        return this;
      },
    };
    console.log(student.fn() === student);
    

    构造函数调用或者类上下文

    构造函数作为JavaScript创建对象的那只大母鸡(实际上类是构造函数的语法糖),通常程序界有个段子叫做new 一个对象,谁还敢说程序员(媛)没有对象的,这种方式调用this指向的是你new出来的那个对象实例本身:

    function Person(name){
      console.log(this);
      this.name = name
    }
    
    const p = new Person('tom')
    console.log(p);
    

    箭头函数中的this

    箭头函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

    var obj = {
      name: "tom",
      foo() {
        setTimeout(() => {
          console.log(this);
        }, 1000);
      },
    };
    
    obj.foo() // obj
    
    

    面试题

    常见面试题有: 1、手写bind函数

    Function.prototype.mybind = function (ctx, ...args) {
      const fn = this;
      return function () {
        fn.apply(ctx, args);
      };
    };
    
    function foo(x, y) {
      console.log(this, x, y);
    }
    
    const foo1 = foo.mybind({ name: "zhangsan" }, 10, 20);
    foo1();
    
    

    2、new 操作符调用构造函数,具体做了什么?

    • 创建一个新的对象;
    • 将构造函数的 this 指向这个新对象;
    • 为这个对象添加属性、方法等;
    • 最终返回新对象。

    起源地下载网 » 浅谈JavaScript中this的指向问题及面试题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元