在全局作用域中调用 this, this 的引用的就是 window
严格模式下,this 为 undefined
,否则,会默认为 window
var o = {
color: "blue",
sayColor: function() {
return this.color; // 在对象中,故 this 指向对象 o
},
};
o.sayColor(); // blue
var o = { color: "blue" };
function sayColor() {
return this.color;
}
o.sayColor = sayColor; // 已经将外面(全局)的 sayColor 中的 this 绑定到对象 o 中
o.sayColor(); // blue
function person() {
this.name = "Jack";
}
var o = new person();
console.log(o.name);
关键字 new
会调用构造函数,这里也就是调用了函数的构造函数,新建了一个函数对象,同时,this 也指向了这个函数对象
apply 和 call 用途都是在特定的作用域中调用函数,即设置函数体内的 this
接受两个参数
function sum(num1, num2) {
return num1 + num2;
}
function callSum1(num1, num2) {
return sum.apply(this, arguments);
}
function callSum2(num1, num2) {
return sum.apply(this, [num1, num2]);
}
console.log(callSum1(10, 10));
console.log(callSum2(10, 10));
在 callSum1 中,传入了 this 这个外部的作用域,arguments
为函数内部的一个参数数组
在 callSum2 中,传入了 this 这个外部的作用域,显式地将参数包装成一个数组传入
call 与 apply 基本相同,但第二个参数,需要将函数参数逐个列举出来
function sum(num1, num2) {
return num1 + num2;
}
function callSum1(num1, num2) {
return call(this, num1, num2); // <<< 不同在这里
}
console.log(callSum(10, 10));
ES5 开始定义的方法
aMethod.bind(thisWillBoundTo)
bind 会创建一个函数实例并返回,其中,aMethod 中的 this
会绑定到参数 thisWillBoundTo
这个对象中
window.color = "red";
var o = { color: "blue" };
function sayColor() {
console.log(this.color);
}
var object = sayColor.bind(o); // sayColor 的 this 已经被绑定到 o 中
object.sayColor(); // blue
闭包中的 this, 是基于运行时函数的执行环境的对象,在全局函数中,this -> window, 作为对象的方法,this -> 那个对象
var color = "red";
var o = {
name: "blue",
sayColor: function() {
return function() {
return this.color;
};
},
};
console.log(o.sayColor()()); // red
在上面,o.sayColor() 返回一个函数对象,之后再来一个 (),表示调用返回的函数,但此时,函数调用的时候,this 已经指向了全局
var o = {
color: "blue",
sayColor: function() {
var innerThis = this;
return function() {
return innerThis.color;
};
},
};
console.log(o.sayColor()()); // blue
在上面,o.sayColor() 返回一个函数对象,之后再来一个 (),返回的这个函数实例中,函数体中提前将 this 保存为指向对象的 this
箭头函数中的 this,指向的,就是定义时所在的对象,而不是使用时的对象
函数绑定运算符 ::
thisWillBoundTo::aMethod; <==> aMethod.bind(thisWillBoundTo);
foo::bar;
// 等同于
bar.bind(foo);