1. this可以隐式传递对象的引用。
2. this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
3. this是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
4. this默认绑定到全局对象。只有函数运行在非strict mode下时,默认绑定才能绑定到全局对象;在严格模式下调用函数则不影响默认绑定。
5. 隐式绑定this时,需要在一个对象内部包含一个指向函数的属性,并通过这个属性间接引用函数,从而把this间接(隐式)绑定到这个对象上。
6. 函数的call()、apply()方法可以实现this的显示绑定。
7. 回调函数会发生this绑定丢失的情况。硬绑定可以解决这个问题。ES5提供了硬绑定的内置方法Function.prototype.bind。bind(...)会返回一个硬编码的新函数,它会把你指定的参数设置为this的上下文并调用原始函数。
function foo() {
console.log(this.a);
}
var obj = {
a:2
};
var bar = function() {
foo.call(obj); //显示的强制绑定,即硬绑定。
};
bar(); // 2
setTimeout(bar, 100); // 2
// 硬绑定的bar不可能再修改它的this
bar.call(window); // 2
8. 包括内置对象在内的所有函数都可以用new来调用,这种函数调用被称为构造函数调用。实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”。
发生构造函数调用时,会自动执行下面的操作:
(1)创建(或者说构造)一个全新的对象。
(2)这个新对象会被执行[[Prototype]]连接。
(3)这个新对象会绑定到函数调用的this。
(4)如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。
function foo(a) {
this.a = a;
}
var bar = new foo(2); // 构造一个新的对象并把它绑定到foo(..)调用中的this上
console.log(bar.a); // 2