JS中this的指向以及call、apply的作用

本篇文章给大家分享了js基础内容this指向以及call、apply的相关知识点内容,有兴趣的朋友可以学习参考下。

在具体的实际应用中,this 的指向无法在函数定义时确定,而是在函数执行的时候才确定的,根据执行时的环境大致可以分为以下3种:

1、当函数作为普通函数调用时,this 指向全局对象

2、当函数作为对象的方法调用时,this 指向该对象

3、当函数作为构造器调用时,this 指向新创建的对象

示例一:

window.name = 'myname';function getName() {  console.log(this.name);}getName(); //输出myname

登录后复制

示例二:

var boy = {  name: 'Bob',  getName: function() {    console.log(this.name);  }}boy.getName(); //输出Bob

登录后复制

示例三:

function Boy(name) {  this.name = name;}var boy1 = new Boy('Bob');console.log(boy1.name); //输出Bob

登录后复制

对于示例三,还有一种特殊情况,就是当构造函数通过 “return” 返回的是一个对象的时候,此次运算的最终结果返回的就是这个对象,而不是新创建的对象,因此 this 在这种情况下并没有什么用。

示例四:

function Boy(name) {  this.name = name;  return { //返回一个对象    name: 'Jack'  }}var boy1 = new Boy('Bob');console.log(boy1.name); //输出Jack

登录后复制

示例五:

function Boy(name) {  this.name = name;  return 1; //返回非对象}var boy1 = new Boy('Bob');console.log(boy1.name); //输出Bob

登录后复制

call 和 apply 的作用

apply 接受两个参数,第一个参数指定了函数体内 this 的指向,第二个参数是一个数组或类数组,用于传递被调用函数的参数列表。

示例一:

function getInfo() {  console.log(this.name+' like '+arguments[0]+' and '+arguments[1]);}var boy1 = {  name: 'Bob',  age: 12}getInfo.apply(boy1,['sing','swimming']); //输出Bob like sing and swimming

登录后复制

call 传入参数的数量是不固定的,跟 apply 相同的是,第一个参数也是用于指定函数体内 this 的指向,从第二个参数开始往后,每个参数被依次传入被调用函数。

示例二:

function getInfo() {  console.log(this.name+' like '+arguments[0]+' and '+arguments[1]);}var boy1 = {  name: 'Bob',  age: 12}getInfo.call(boy1,'sing','shopping'); //输出Bob like sing and shopping

登录后复制

此外,大部分高级浏览器还实现了 bind 方法,它与 call 和 apply 的区别在于 bind 只是改变函数内部 this 的指向,但不会立即执行,你需要显示调用它。

示例三:模拟浏览器的 bind 方法

Function.prototype.bind = function(obj){  var self = this;  return function(){    return self.apply(obj,arguments);  }};var obj = {  name: 'Bob',  age: 12};var func = function(){  console.log(this.name+' like '+arguments[0]+' and '+arguments[1]);}.bind(obj);func('sing','shopping');

登录后复制

丢失的 this

在某些情况下会丢失 this 的指向,此时,我们就需要借助 call、apply 和 bind 来改变 this 的指向问题。

示例一:当 “getName” 方法作为 “boy” 对象的属性调用时,this 指向 “boy” 对象,当另外一个变量引用 “getName” 方法时,因为它是作为普通函数调用,所以 this 指向全局对象window

var boy = {  name: 'Bob',  getName: function() {    console.log(this.name);  }}boy.getName(); //输出Bobvar getBoyName = boy.getName;getBoyName(); //输出undefined

登录后复制

示例二:即使在函数内部定义的函数,如果它作为普通对象调用,this 同样指向 window 对象

var boy1 = {  name: 'Bob',  age: 12,  getInfo: function() {    console.log(this.name);    function getAge() {      console.log(this.age);    }    getAge();  }}boy1.getInfo(); //Bob        //undefined

登录后复制

以上就是本章的全部内容,更多相关教程请访问JavaScript视频教程!

以上就是JS中this的指向以及call、apply的作用的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月8日 02:10:45
下一篇 2025年3月2日 06:49:16

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

相关推荐

  • call()和apply()方法有什么区别

    本篇文章主要和大家介绍javascript中的call()和apply()方法的使用以及它们之间的区别,有一定的参考价值,希望对大家有帮助 在JavaScript中我们经常用两种方法来改变this的指向,简化代码的复杂度,这两种方法就是ca…

    2025年3月8日
    200
  • 什么是this?一文让你秒懂this

    本篇文章给大家带来的内容是关于什么是this?一文让你秒懂this,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。日常开发中经常会遇到 this 指向的 bug,郁闷好久才猛然醒悟,痛定思痛,将 this 做个汇总,以便在日…

    编程技术 2025年3月8日
    200
  • 在JavaScript函数中this指向的是什么

    今天将和大家分享JavaScript中一个重要知识点this,有一定的参考价值,希望对大家学习有所帮助。 对于this关键字的学习经常让我们感到困惑,搞不清楚它在函数中指代的是什么以及如何去使用它,今天将在文章中为大家详细介绍有关this的…

    2025年3月8日 编程技术
    200
  • 关于js中this、原型与闭包的深入理解

    1、this关键字 a、有对象指向对象; b、没对象指向全局变量(window); c、有new指向new出的新对象; d、bind,call&apply改变this的指向; e、setTimeout/setInterval thi…

    2025年3月8日
    200
  • 5种正确处理JS的this指向的方式

    我喜欢在JS中更改函数执行上下文的指向,也称为 this 指向。 例如,咱们可以在类数组对象上使用数组方法: const reduce = Array.prototype.reduce;function sumArgs() {  retur…

    2025年3月8日
    200
  • JavaScript中this绑定方式总结

    最近在回顾js的一些基础知识,把《你不知道的js》系列又看了一遍,this始终是重中之重,还是决定把this相关知识做一个系统的总结,也方便自己日后回顾。 this的四条绑定规则 1.默认绑定 这是最常用的函数调用类型:独立函数调用(即函数…

    2025年3月8日
    200
  • js中call、apply、bind的区别

    在 javascript 中,call、apply、bind 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。 js中call、apply、bind的区别 call、appl…

    2025年3月8日
    200
  • 手动实现js中的call、bind、instanceof

    js中call能够改变this的指向、bind能改变this的指向,并返回一个函数,这是怎么实现的呢?本文将带你一步步实现这些功能,希望对学习JavaScript的朋友有帮助。 前言 现在的前端门槛越来越高,不再是只会写写页面那么简单。模块…

    2025年3月8日
    200
  • 关于js中的This指向问题的介绍

    1、基本概念 MDN的官方解释:与其他语言相比,函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别。在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被…

    2025年3月8日
    200
  • JS 中几种处理’this’指向的方式

    我喜欢在JS中更改函数执行上下文的指向,也称为 this 指向。 例如,咱们可以在类数组对象上使用数组方法: const reduce = Array.prototype.reduce;function sumArgs() {  retur…

    2025年3月7日
    200

发表回复

登录后才能评论