function 普通执行 this指向的是window
而new的时候 this 是指向这个实例的
要不停的看基础才行。 不停的看 不停的看
这里需要说下 call 和apply 当你做某个应用时,需要把一个function中的this 绑定到一个 具体的Object上面,来执行这个funciton,那么你该怎么做?
function lei(){
alert(this.name.toUpperCase())
}
var test = {
name:'dinglei'
}
lei.call(test) //DINGLEI
随着你的使用模式越来越复杂,显式传递上下文对象会让代码变得越来越混乱,使用 this 则不会这样--《你不知道的JavaScript》
巨大的需要注意的地方:this是在运行时进行绑定的,并不是编写时帮绑定的。它的具体指向,是你当时如何运行这个函数决定的。
普通执行
function test (){console this.a}
对象绑定
obj = {name:test,a:'ddd'} obj.name()
隐试绑定和显示绑定。。 最后还有个显示变种硬绑定。
Function.prototype.bind 就是硬绑定。。 返回的是一个已经绑定死this的函数。。。 啦啦啦啦啦啦啦
那么这是怎么实现的? 其实bind 就是返回个函数 而这个函数里面是 apply在干活, 所以一直只能是 绑定的那个obj在那里哦
// 简单的辅助绑定函数
function bind(fn, obj) {
return function() {
return fn.apply( obj, arguments );
};
}
new 绑定
最后做个总结:如何识别this的绑定
判断 this
现在我们可以根据优先级来判断函数在某个调用位置应用的是哪条规则。可以按照下面的
顺序来进行判断:
1. 函数是否在 new 中调用( new 绑定)?如果是的话 this 绑定的是新创建的对象。
var bar = new foo()
2. 函数是否通过 call 、 apply (显式绑定)或者硬绑定调用?如果是的话, this 绑定的是
指定的对象。
var bar = foo.call(obj2)
3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话, this 绑定的是那个上
下文对象。
var bar = obj1.foo()
4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined ,否则绑定到
全局对象。
var bar = foo()
就是这样。对于正常的函数调用来说,理解了这些知识你就可以明白 this 的绑定原理了。
不过……凡事总有例外
this 绑定的应用:
1.函数参数柯里化
function foo(a,b) {
console.log( "a:" + a + ", b:" + b );
}
// 把数组“展开”成参数
foo.apply( null, [2, 3] ); // a:2, b:3
// 使用 bind(..) 进行柯里化
var bar = foo.bind( null, 2 );
bar( 3 ); // a:2, b:3