this 的分析图
this 是什么?
this 是指当包含它的函数作为方法调用的时候所属的对象,刚开始我也有点懵B,就查gg,然后总结把它分为三句话能好理解点。
-
包含它的函数
-
作为方法被调用
-
所属的对象
function showName(){ console.log(this); //window } showName();//方法调用时
包含的它的函数是showName(),调用后showName()相当于window.showName()所以这里的this 就代表了window.
总结:谁调用了this,this就是谁的对象,谁最后调用了this,this就是谁的对象
那this是怎么应用的
this是由被调用的方式确定”这个事实,使得this可以被改变,从而为函数增加了动态性,可变性,使得变成更加灵活
调用位置
调用位置就指的是函数在代码中被调用的位置(不懂可看上面的代码)
5 种this 绑定全面解析
默认绑定(严格和非严格)
隐式绑定
显示绑定
new绑定
箭头函数绑定
默认绑定
在独立的函数调用下可以把默认绑定看作this 指向群局对象,在严格模式下,this 会绑定到undifined 且调用函数不影响默认绑定
严格模式下(use strict),不能将全局对象用于默认绑定,this会绑定到undefined。只有函数运行在非严格模式下,默认绑定才能绑定到全局对象。在严格模式下调用函数则不影响默认绑定。
function foo() { // 运行在严格模式下,this会绑定到undefined
"use strict";
console.log( this.a );
}
var a = 2;
// 调用
foo(); // TypeError: Cannot read property 'a' of undefined
// --------------------------------------
function foo() { // 运行
console.log( this.a );
}
var a = 2;
(function() { // 严格模式下调用函数则不影响默认绑定
"use strict";
foo(); // 2
})();
隐式绑定
当函数引用另一个函数(有上下文对象)的时候,该规则会把this绑定到这个函数(上下文对象)中,并且只有在调用的时候起作用
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo//调用了上面的function foo();
};//这个指的就是有上下文的对象
obj.foo(); // 2
显示绑定
call,apply,bind 的区别
通过call,apply,bind进行绑定,第一个参数指的是一个对象,而且是将方法(call,apply,bind)this绑定到参数对象的上下文中(个人理解可能有点绕)。
call和apply 的区别是传参列表不同,call是单个参数,apply是数组
bind和call,apply的区别是:call,apply是直接执行函数,而bind是生成一个函数,要执行的话需要去再调用函数执行。bind 和 call 的传参以及this 绑定一样。
显式绑定的方法
call 方法:
function foo() {
console.log( this.a );
}
var obj = {
a: 2
};
foo.call( obj ); // 2 调用foo时强制把foo的this绑定到obj上
apply 方法:
function foo(something) {
console.log( this.a, something );
return this.a + something;
}
function bind(fn, obj) {
return function() {
return fn.apply( obj, arguments );
}
}
var obj = {
a: 2
};
var bar = bind( foo, obj );
var b = bar( 3 ); // 2 3
console.log( b ); // 5
bind 方法:
function foo(something) {
console.log( this.a, something );
return this.a + something;
}
var obj = {
a: 2
};
var bar = foo.bind( obj );
var b = bar( 3 ); // 2 3
console.log( b ); // 5
new 绑定
- 构造函数:只是使用了new操作符时被调用的普通函数,不属于也不会实列化一个类
- 包括内置函数在内的所有的函数都可以使用new来调用,这就叫做构造函数的调用
- 其实构造函数叫做函数的"构造调用"
在使用new来调用函数的时候(构造函数的调用)系统会自动执行下列操作:
-
构造一个新对象
-
这对象会和被执行的[[prototype]]连接
-
这个对象会绑定到函数调用的this
-
如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象
function foo(a) { this.a = a; } var bar = new foo(2); // bar和foo(..)调用中的this进行绑定 console.log( bar.a ); // 2
绑定的优先级
默认 < 隐式 < 显式 < new