1.默认绑定
function foo(){
console.log(this.a);
}
var a = 2;
foo() // a
函数调用时应用了this的默认绑定,因此this指向全局变量a(注意如果是严格模式,不能将全局变量用于默认绑定,this会被绑定到undefined)
2.隐式绑定
function foo(){
console.log(this.a);
}
var obj = {
a :2,
foo:foo
}
obj.foo()//2
当foo被调用时,它的前面加上了对obj的引用。当函数引用有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象
隐式丢失
function foo(){
console.log(this.a);
}
var obj = {
a :2,
foo:foo
}
var a = "global variable"
var bar = obj.foo;bar(); // global variable
bar 是obj.foo 的一个引用,但是它引用的是函数自身。因此,此时的bar其实是一个不带任何修饰的函数调用。注意:当作为参数传递时,效果一样
显示绑定
使用bind、call、apply都可以用来绑定this(注意他们的区别)
function foo(){
console.log(this.a);
}
var obj = {
a :2
}
foo.call(obj); //2 将this绑到到了obj对象
如果传递的不是一个对象,而是一个原始值(字符串、布尔、数字类型等),这个原始值会被转换为它的对象形式(new String()),这通常被称为装箱
new 绑定
function foo(a){
this.a = a;
}
var bar = new foo(2);
console.log(bar.a) //2
使用new来调用foo(...)时,我们会构造一个对象并把它绑定到foo(...)调用的this上。 读者需要注意new 调用时,会自动执行4个过程,感兴趣的同学可以自己了解,后面的博文会介绍。