如果要想把this
的值从一个环境传到另一个,就要用call
/apply
/bind
方法
call 的第一个参数 绑定 this,后面的参数为实参
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 的第一个参数 绑定 this,后面的参数为实参(但是是数组的形式)
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 的第一个参数绑定 this,后面的参数为实参(不需要为数组的形式)
需要注意的是:调用 bind 方法,并不会直接执行,而是会返回一个新的函数,需要再次运行这个新函数。
function sum(c) {
console.log(this.a + this.b + c);
}
var obj = { a: 1, b: 2 };
var newF = sum.bind(obj, 3);
newF();
// 实参 必须 大于等于 形参
var globalObject = this;
var foo = (() => {return this});
console.log(foo() === globalObject);
当一个函数用作构造函数时(使用new关键字),它的this
被绑定到正在构造的新对象。
虽然构造函数返回的默认值是 this
所指的那个对象,但它仍可以手动返回其他的对象(如果返回值不是一个对象,则返回 this
对象)。
/*
* 构造函数这样工作:
*
* 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;
”成了“僵尸”代码,实际上并不是真正的“僵尸”,这条语句执行了,但是对于外部没有任何影响,因此完全可以忽略它)。
参考链接:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。