- 默认绑定 // 没人绑定,this => window
- 隐式绑定 // 谁调用this指向谁
- 显示绑定 // bind call apply
- 构造器调用。(构造器里的this指向返回的这个对象)这里可以联系new的原理过程
new过程发生的事情
- 创建(或者说构造)一个全新的对象。
- 这个新对象会被执行[[ 原型]] 连接。(proto__: Obj.prototype)
- 这个新对象会绑定到函数调用的this。
- 如果函数没有返回其他对象,那么new 表达式中的函数调用会自动返回这个新对象。
用来指定函数内部的this指向,以下是bind的源码
Function.prototype.bind = function(){
var self = this, // 保存原函数
context = [].shift.call( arguments ), // 需要绑定的this上下文
args = [].slice.call( arguments ); // 剩余的参数转成数组
console.log(self)
return function(){ // 返回一个新的函数
return self.apply( context, [].concat.call( args, [].slice.call( arguments ) ) );
// 执行新的函数的时候,会把之前传入的context当作新函数体内的this
// 并且组合两次分别传入的参数,作为新函数的参数
}
};
var obj = {
name: 'sven'
};
var func = function( a, b, c, d ){
console.log ( this.name ); // 输出:sven
console.log ( [ a, b, c, d ] ) // 输出:[ 1, 2, 3, 4 ]
}.bind( obj, 1, 2 );
func( 3, 4 );
对this的应用
var a = 123,
b = 234;
function text() {
var a = 111,
b = 123;
console.log(this.a)
console.log(this.b)
}
var n = new text() // new操作符相当于函数执行,返回一个对象,this绑定在{}上
console.log(n.a)
console.log(n.b)