1、this的默认绑定(this == window)
function foo(){
console.log(this == window)//true
}
foo();
2、new绑定:this指代将来创建的那个对象
function Person(){
this.name = "李四";
console.log(this)//this指代p
}
var p = new Person();
3、隐式绑定:对象.方法()
var p = {
name : "abc",
foo : function (){
console.log(this.name);//this指代p
}
}
p.foo();
//----------------------
var name = "李四";
function foo(){
console.log(this.name);
}
var p = {
name : "abc",
foo : foo
}
p.foo();// abc
foo(); // "李四"
//------------
var p = {
name : "abc",
foo : function (){
console.log(this.name);
}
}
var f = p.foo;
var name = "李四";
f(); // 李四
//---------------
var p = {
name : "李四",
inner : {
name : "张三",
foo : function (){
console.log(this.name);
}
}
}
var name = "王五";
p.inner.foo();//张三
4、显式绑定
主要分为call、apply以及bind
优先级:显式绑定优先级最高(大于隐式、默认及new绑定),且bind优先级大于call和apply
var name = "a"
function foo(){
console.log(this.name);
}
//永远绑定this,返回值就是绑定成功的那个函数。 对原来的函数没有任何的影响
var foo1 = foo.bind({name : "b"})
foo1() // b
foo1.call({name : "c"}) // b
a、显式绑定时,如果传入的是null, undefined的时候this的绑定丢失问题!this变成window
b、如果传入的是基本类型如数值,则返回undefined,因为相当于new Number(数值)--万物皆对象
c、ES6对显式绑定做了一个新的 扩展。
var 返回的对象 = 对象.bind(要绑定的对象)