zoukankan      html  css  js  c++  java
  • js中关于this的理解

    常见:在普通函数中的this,指向 全局

    function thisObj(name){
        this.name = name;
        console.log(this);
    }

    但是在严格模式下的函数,this指向 underfined.

    混淆点.内部函数中的this指向:

    var numbers = {
       numberA: 5,
       numberB: 10,
       sum: function() {
         console.log(this === numbers); // => true
         function calculate() {
           // this is window or undefined in strict mode
           console.log(this === window); // => true
           console.log(this === numbers); // => false;
           return this.numberA + this.numberB;
         };
         return calculate();
       }
    };
    numbers.sum();

    在上述numbers对象中,sum函数是numbers对象的方法。所以sum函数中的this指向numbers对象。

    但是在内部函数calculate中,我们如果以为this也是指向numbers对象那就打错特错了。

    在这里该内部对象是一个函数调用,并不是对象的方法。所以calculate中的this指向 window。

    所以为了避免calculate中的this指向错误。要进行如下修改,将this值指向numbers对象。

    var numbers = {
       numberA: 5,
       numberB: 10,
       sum: function() {
         console.log(this === numbers); // => true
         function calculate() {
           // this is window or undefined in strict mode
           console.log(this === window); // => true
           console.log(this === numbers); // => false;
           return this.numberA + this.numberB;
         };
         return calculate.call(this);//return calculate();
       }
    };
    numbers.sum();

    混淆点.从Object中分离的方法

    function People(name){
        this.name = name;
        this.action = function(){
            console.log("this是否等于window " + this === window)
            console.log(this.name)
        }
    }
    var xiaoA = new People('xyf');
    var zz = xiaoA.action;
    zz();  //输出错误
    xiaoA.action() // 输出 xyf
    setInterval(xiaoA.action,500000);//错误
    setInterval(xiaoA.action.bind(xiaoA),500000);//循环输出 xyf
    这里要注意  如果直接输出 xiaoA.action();是可以正确输出的。但是当我们将xiaoA.action赋值给变量zz之后。该action方法就从原来的Object中分离了。这时候的this指向全局变量。setInterval定时器也会产生这样的问题。如果要正确显示需要用bind重新绑定对象。
    var zz =xiaoA.action.bind(xiaoA);
    zz(); //输出 xyf

    apply调用

    apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。apply()的参数为空时,默认调用全局对象。

  • 相关阅读:
    招聘ASP.NET(C#)开发人员(已经截止,谢谢大家支持)
    VisualStudioCode开发Vue
    全局异常处理机制(Filter拦截器对比)
    工程师
    kubernetes(k8s)里面部署服务器集群并访问项目
    webpack 就是前端模块化打包工具
    Visual Studio Code配置C/C++开发环境
    docker和k8s(Kubernetes)是配套使用
    kettle 多表全删全插同步数据
    wireshark 抓HTTPS 的包 HTTPS = TLS + HTTP TLSv1.2 协议
  • 原文地址:https://www.cnblogs.com/enmeen/p/5714892.html
Copyright © 2011-2022 走看看