前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >this 指向(二)

this 指向(二)

原创
作者头像
小小范
发布2022-01-19 14:22:51
7720
发布2022-01-19 14:22:51
举报
文章被收录于专栏:持续学习持续学习

如果要想把this的值从一个环境传到另一个,就要用call/apply/bind方法

一、call

call 的第一个参数 绑定 this,后面的参数为实参

代码语言:javascript
复制
function add(c, d) {
  return this.a + this.b + c + d;
}

var o = {a: 1, b: 3};

// 第一个参数是用作“this”的对象
// 其余参数用作函数的参数
add.call(o, 5, 7); // 16

二、apply

apply 的第一个参数 绑定 this,后面的参数为实参(但是是数组的形式

代码语言:javascript
复制
function add(c, d) {
  return this.a + this.b + c + d;
}

var o = {a: 1, b: 3};

// 第一个参数是用作“this”的对象
// 第二个参数是一个数组,数组中的两个成员用作函数参数
add.apply(o, [10, 20]); // 34

三、bind

bind 的第一个参数绑定 this,后面的参数为实参(不需要为数组的形式)

需要注意的是:调用 bind 方法,并不会直接执行,而是会返回一个新的函数,需要再次运行这个新函数。

代码语言:javascript
复制
function sum(c) {
  console.log(this.a + this.b + c);
}
var obj = { a: 1, b: 2 };
var newF = sum.bind(obj, 3);
newF();

// 实参 必须 大于等于 形参

四、箭头函数中的 this

代码语言:javascript
复制
var globalObject = this;
var foo = (() => {return this});
console.log(foo() === globalObject);

五、构造函数的 this

当一个函数用作构造函数时(使用new关键字),它的this被绑定到正在构造的新对象。

虽然构造函数返回的默认值是 this 所指的那个对象,但它仍可以手动返回其他的对象(如果返回值不是一个对象,则返回 this 对象)。

代码语言:javascript
复制
/*
 * 构造函数这样工作:
 *
 * function MyConstructor(){
 *   // 函数实体写在这里
 *   // 根据需要在this上创建属性,然后赋值给它们,比如:
 *   this.fum = "nom";
 *   // 等等...
 *
 *   // 如果函数具有返回一个对象的return语句,
 *   // 则该对象将是 new 表达式的结果。
 *   // 否则,表达式的结果是当前绑定到 this 的对象。
 *   //(即通常看到的常见情况)。
 * }
 */

function C(){
  this.a = 37;
}

var o = new C();
console.log(o.a); // logs 37


function C2(){
  this.a = 37;
  return {a:38};
}

o = new C2();
console.log(o.a); // logs 38

在刚刚的例子中(C2),因为在调用构造函数的过程中,手动的设置了返回对象,与this绑定的默认对象被丢弃了。(这基本上使得语句 “this.a = 37;”成了“僵尸”代码,实际上并不是真正的“僵尸”,这条语句执行了,但是对于外部没有任何影响,因此完全可以忽略它)。


参考链接:

  1. this - JavaScript | MDN (mozilla.org)
  2. Function.prototype.bind() - JavaScript | MDN (mozilla.org)
  3. Object.prototype.toString() - JavaScript | MDN (mozilla.org)
  4. JavaScript 数据类型和数据结构 - JavaScript | MDN (mozilla.org)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、call
  • 二、apply
  • 三、bind
  • 四、箭头函数中的 this
  • 五、构造函数的 this
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档