推广

this指向的问题以及call()、apply()、bind()修改this指向

iseeyu2年前 (2024-02-22)推广125

情形一.png

情形二:有对象去调用

对象去调用方法,this指向的最后一次调用的对象。

var name = 'global';
var b = {
  name: 'b的name',
  fn() {
   console.log(this.name);
  }
}
b.fn(); // 打印的是 'b的name'

情形二.png

情形三:this只会指向最后一次调用的对象
var name = 'global';
var c = {
  name: 'c的name',
  fn() {
    console.log(this.name);
  }
}
window.c.fn();

情形三.png

情形四:当最后一次调用的对象内部没有该属性时
var name = 'global';
var d = {
  fn() {
    console.log(this.name);
  }
}
window.d.fn();

情形四.png

情形五:比较 坑!的情形

把e中的fn()赋值给了f,但是f并没有对象去调用,此时依旧为window.f()

var name = 'global';
var e = {
  name: 'e的name',
  fn() {
    console.log(this.name);
  }
}
var f = e.fn;
f();

情形五.png

情形六:

demo方法被window调用,因此,内部的this指向依旧是window,内部函数fn()等价于this.fn()因此,打印的结果是global

var name = 'global';    
function demo() {
  var name = 'g的name';
  fn();
  function fn() {
    console.log(this.name);
  }
}
demo();

情形六.png

2、改变this的指向一:ES6中的箭头函数

ES6中的箭头函数是没有this指向的,如果在箭头函数中使用this,那么它指向的是上下文对象。

function Foo(){
    this.name = "Foo的name"
}
// 在原型对象上新增方法
Foo.prototype.getName = function(){
  console.log('getName打印的姓名:',this.name)
}
Foo.prototype.putName = function(){
  setTimeout(function(){
    this.getName()
  },100)
}
var f = new Foo();
f.putName();

这种情况下在setTimeout内部console.log一下this

image.png

发现指向的是全局对象window,这是因为ES5的写法带来的影响,如果换成ES6的箭头函数就会解决此类题。

Foo.prototype.putName = function(){
  setTimeout(() => {
    console.log(this);
    this.getName()
  },100)
}

image.png

这样指向就修改正确了。

3、改变this的指向二:apply()

fn.apply(target, [argumentsList])

  • target:函数调用时绑定的这个对象
  • argumentsList:函数调用时预期的实参列表,该参数应该是一个类数组的对象

同样的使用之前的测试案例

function Foo(){
    this.name = "Foo的name"
}
// 在原型对象上新增方法
Foo.prototype.getName = function(){
  console.log('getName打印的姓名:',this.name)
}
Foo.prototype.putName = function(){
  setTimeout(function(){
    this.getName()
  },100)
}
var f = new Foo();
f.putName();

目前的this指向的是window全局对象,可以在函数末尾添加apply(f)去指定函数调用的实例对象f.

Foo.prototype.putName = function(){
     setTimeout(function(){
        console.log(this);
         this.getName()
    }.apply(f),100)
}

image.png

修改后的结果指向依旧是正确的

4、改变this的指向三:call()

Foo.prototype.putName = function(){
  setTimeout(function(){
    console.log(this);
    this.getName()
  }.call(f),100)
}

image.png

5、改变this的指向四:bind()

Foo.prototype.putName = function(){
  setTimeout(function(){
    console.log(this);
    this.getName()
  }.bind(f)(),100)
}

image.png

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/55825.html

相关文章

网站site不在首页说明什么问题。

网站site不在首页说明什么问题。

 网站site是什么? 网站site指的是你网站大约的收录量,比如site:www.zhanyouyun.com 这样就能搜到SEO篇章到底有多少文章收录了,但这只是一个约值,仅做参考。 网站site不在首页说明什么问题? 做过站群的人就会知道域名和模板是网站前期重要的组成部分...

小编分享网站SEO外链怎样发才会被收录全网推广专家告诉你。

小编分享网站SEO外链怎样发才会被收录全网推广专家告诉你。

外链依然是大部分行业获取关键词排名的主要方法,对于处于关键词排名前期的新站,外链的作用依然很大。如何才能让我们发布的外链快速被收录并计入关键词排名呢?跟随全网推广小编一起来看看外链发布方法! 一、寻找收录快、活跃量高并且价值大的平台 这样的平台发布文章被收录的概率会越大,什么是收录率高...

2022春节营销创意案例盘点,收藏!

2022春节营销创意案例盘点,收藏!

春节一直是各大商争相追逐的重点,一次成功的春节营销,既要懂得如何借势节日与消费者展开沟通,更要懂得如何从众多品牌集体借势营销中找到另外的突破口。那么,2022春节又有哪些出圈的营销案例?我们来一起看看吧!故乡主题关键词:团圆,欢聚,故乡苹果《卷土重来》苹果每年推出一部贺岁片...

!朱老师 (银行营销管理专家)

!朱老师 (银行营销管理专家)

国家一级培训师曾任某国有银行支行行长上百家银行咨询辅导经验10 年银行培训与网点辅导经验 单一客户重复返聘率达 20 多次 国有银行及多家股份制银行合作经历“普惠金融·整村授信”体系化创始人 格莱珉 · 中国和尤努斯基金会高级研究员/实施顾问朱华老师是普惠金融的深度实践者...

逻辑性营销思维解决你的品牌营销推广难题。

逻辑性营销思维解决你的品牌营销推广难题。

营销推广到底有什么难以捉摸的逻辑?让很多营销人员总是与正确的方向背道而驰。简要回顾了四种网络营销工作的新思路。无论怎么说,始终认为营销的本质没有改变,洞察人性的道路已经改变。然而,如果你不能通过现象看到本质,你如何才能洞察营销背后的真正逻辑呢?我们不多说,下面分析三种营销思维背后的逻辑问题。...

「招商进阶」操盘手必须掌握的五大招商渠道

「招商进阶」操盘手必须掌握的五大招商渠道

在我们讨论产业的时候,我们首先应该思考一个问题,产业园区的生态系统应该是什么样。图:清华科技园在客户这个要素里,我们要了解,目标客户的定位和特点,客户需求的明确和分析,客户需求的调整和确认,从而才能为客户提供合适的方式和服务。 一、正确认识产业客户需求与特征就是和...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片