几种js中this函数的调用方式

javascript中的this含义非常丰富,它可以是全局对象,当前对象或者是任意对象,这都取决于函数的调用方式。函数有以下几种调用方式:作为对象方法调用、作为函数调用、作为构造函数调用、apply或call调用。

对象方法调用

作为对象方法调用的时候,this会被绑定到该对象。

var point = {    x : 0,    y : 0,    moveTo : function(x, y) {        this.x = this.x + x;        this.y = this.y + y;        }    };      point.moveTo(1, 1)//this 绑定到当前对象,即 point 对象

登录后复制

这里我想强调一点内容,就是this是在函数执行的时候去获取对应的值,而不是函数定义时。即使是对象方法调用,如果该方法的函数属性以函数名的形式传入别的作用域,也会改变this的指向。我举一个例子:

var a = {      aa : 0,      bb : 0,      fun : function(x,y){          this.aa = this.aa + x;          this.bb = this.bb + y;      }  };  var aa = 1;  var b = {      aa:0,      bb:0,      fun : function(){return this.aa;}  }     a.fun(3,2);  document.write(a.aa);//3,this指向对象本身  document.write(b.fun());//0,this指向对象本身  (function(aa){//注意传入的是函数,而不是函数执行的结果      var c = aa();      document.write(c);//1 , 由于fun在该处执行,导致this不再指向对象本身,而是这里的window  })(b.fun);

登录后复制

这样就明白了吧。这是一个容易混淆的地方。

函数调用

函数也可以直接被调用,这个时候this被绑定到了全局对象。

var x = 1;   function test(){     this.x = 0;   }   test();   alert(x); //0

登录后复制

但这样就会出现一些问题,就是在函数内部定义的函数,其this也会指向全局,而和我们希望的恰恰相反。代码如下:

var point = {    x : 0,    y : 0,    moveTo : function(x, y) {        // 内部函数       var moveX = function(x) {        this.x = x;//this 绑定到了全局      };       // 内部函数      var moveY = function(y) {       this.y = y;//this 绑定到了全局      };         moveX(x);       moveY(y);       }    };    point.moveTo(1, 1);    point.x; //==>0    point.y; //==>0    x; //==>1    y; //==>1

登录后复制

我们会发现不但我们希望的移动呢效果没有完成,反而会多出两个全局变量。那么如何解决呢?只要要进入函数中的函数时将this保存到一个变量中,再运用该变量即可。代码如下:

var point = {    x : 0,    y : 0,    moveTo : function(x, y) {         var that = this;        // 内部函数       var moveX = function(x) {        that.x = x;        };        // 内部函数       var moveY = function(y) {        that.y = y;        }        moveX(x);        moveY(y);        }    };    point.moveTo(1, 1);    point.x; //==>1    point.y; //==>1

登录后复制

构造函数调用

在javascript中自己创建构造函数时可以利用this来指向新创建的对象上。这样就可以避免函数中的this指向全局了

var x = 2;   function test(){     this.x = 1;   }   var o = new test();   alert(x); //2

登录后复制

apply或call调用

这两个方法可以切换函数执行的上下文环境,也就是改变this绑定的对象。apply和call比较类似,区别在于传入参数时一个要求是数组,一个要求是分开传入。所以我们以apply为例:

var name = "window";        var someone = {      name: "Bob",      showName: function(){          alert(this.name);      }  };    var other = {      name: "Tom"  };        someone.showName();     //Bob  someone.showName.apply();    //window  someone.showName.apply(other);    //Tom

登录后复制

可以看到,正常访问对象中方法时,this指向对象。使用了apply后,apply无参数时,this的当前对象是全局,apply有参数时,this的当前对象就是该参数。

箭头函数调用

这里需要补充一点内容,就是在下一代javascript标准ES6中的箭头函数的 this始终指向函数定义时的 this,而非执行时。我们通过一个例子来理解

var o = {      x : 1,      func : function() { console.log(this.x) },      test : function() {          setTimeout(function() {              this.func();          }, 100);      }  };    o.test(); // TypeError : this.func is not a function

登录后复制

上面的代码会出现错误,因为this的指向从o变为了全局。我们需要修改上面的代码如下:

var o = {      x : 1,      func : function() { console.log(this.x) },      test : function() {          var _this = this;          setTimeout(function() {              _this.func();           }, 100);      }  };    o.test();

登录后复制

通过使用外部事先保存的this就行了。这里就可以利用到箭头函数了,我们刚才说过,箭头函数的 this始终指向函数定义时的 this,而非执行时。所以我们将上面的代码修改如下:

var o = {      x : 1,      func : function() { console.log(this.x) },      test : function() {          setTimeout(() => { this.func() }, 100);      }  };    o.test();

登录后复制

这回this就指向o了,我们还需要注意一点的就是这个this是不会改变指向对象的,我们知道call和apply可以改变this的指向,但是在箭头函数中是无效的。

var x = 1,      o = {          x : 10,          test : () => this.x      };    o.test(); // 1  o.test.call(o); // 依然是1

登录后复制

这样就可以明白各种情况下this绑定对象的区别了。

以上就是几种js中this函数的调用方式的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2773415.html

(0)
上一篇 2025年3月8日 13:47:05
下一篇 2025年3月8日 13:47:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue.js中Axios的概念以及使用方法

    本篇文章给大家分享的内容是vue.js中Axios的概念以及使用方法,有着一定的参考价值,有需要的朋友可以参考一下     1.什么是axios    https://www.kancloud.cn/yunye/axios/234845这是…

    2025年3月8日
    000
  • js数组去重以及如何判断出字符串出现次数最多的字符

    本篇文章给大家分享的内容是s数组去重以及如何统计字符串出现最多的字符的代码分享,有着一定的参考价值,有需要的朋友可以参考一下 数组去重: 数组去重function test(str){ let len = str.length; let s…

    编程技术 2025年3月8日
    200
  • 5个关于JavaScript数组的迭代方法

    本篇文章给大家分享的内容是5个关于JavaScript数组的迭代方法,有着一定的参考价值,有需要的朋友可以参考一下 ECMAScript5为数组定义了5个迭代方法。每个方法都接受两个参数:要在每一项运行的函数和(可选的)运行函数的作用域对象…

    编程技术 2025年3月8日
    200
  • 源生JS怎样实现todolist功能

    这次给大家带来源生JS怎样实现todolist功能,源生JS实现todolist功能的注意事项有哪些,下面就是实战案例,一起来看一下。 该项目主要可以练习js操控dom,事件,事件触发之间的逻辑关系,以及如何写入缓存,获取缓存。 主要功能:…

    编程技术 2025年3月8日
    200
  • 深入了解vue.js 之watch用法

    本篇文章给大家分享的内容是深入了解vue.js 之watch用法,有着一定的参考价值,有需要的朋友可以参考一下 watch: 观测vue实例上的数据变动,对应一个对象, 键:就是需要监测的那个东西, 值: 1.可以是当键变化时执行的函数,有…

    编程技术 2025年3月8日
    200
  • Immutable.js怎样实现撤销重做效果

    这次给大家带来Immutable.js怎样实现撤销重做效果,Immutable.js实现撤销重做效果的注意事项有哪些,下面就是实战案例,一起来看一下。 浏览器的功能越来越强大,许多原来由其他客户端提供的功能渐渐转移到了前端,前端应用也越来越…

    编程技术 2025年3月8日
    200
  • 使用Node.js做出命令行工具

    这次给大家带来使用Node.js做出命令行工具,使用Node.js做出命令行工具的注意事项有哪些,下面就是实战案例,一起来看一下。 本文介绍了用Node.js写一个简单的命令行工具,分享给大家,具体如下: 操作系统需要为Linux 1. 目…

    编程技术 2025年3月8日
    200
  • 脚本加载后执行JS回调函数的方法

    这次给大家带来脚本加载后执行JS回调函数的方法,脚本加载后执行JS回调函数的注意事项有哪些,下面就是实战案例,一起来看一下。 项目中经常会遇到这样的问题:当某个 js 脚本加载完成后再执行相应任务,但很多朋友可能并不知道怎么判断我们要加载的…

    编程技术 2025年3月8日
    200
  • angularjs中获取单选按钮的方法

    这次给大家带来angularjs中获取单选按钮的方法,angularjs中获取单选按钮的注意事项有哪些,下面就是实战案例,一起来看一下。 在Html页面中,有三个单选按钮,默认选中的是第二个“重要”这个选项,设置ng-checked=&#8…

    编程技术 2025年3月8日
    200
  • js和html中关于引号的转义总结

    本篇文章给大家分享的内容是js和html中关于引号的转义总结 ,有着一定的参考价值,有需要的朋友可以参考一下 在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下: 登录后复制登录后复制登录后复制登录后复制 IE提示出错后,再…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论