JavaScript中this的使用
this在js中的功能十分强大,根本原因是js非常灵活,this在其中就是如鱼得水。我认为this就是隐式传递,它因为this很灵活可以不停的变换指向的参数,所以我们通常可以用来传递我们的数据,实现代码共享。并且由于函数可以在不同的运行环境执行所以需要有一种机制,能够在函数体内部获得当前的运行环境。
我的理解是正常来说,this 就是 call 的第一个参数,js中省略了这个参数用this来代替,来访问self,self就是自身的意思,那么很容易理解了,当我们使用this时一定要搞清楚self是谁.所以我们经常可以看到that或者self=this。
那么想象一下我们就可以用this拿数据赋值给变量再传递到其他的对象之中。
JS中也为我们准备了.cal,.apply,bindl方法来手动禁用this来改变this的指向 这样可以很明确的知道我传递的是哪个对象。
JavaScript中this的指向
普通函数的调用,this指向的是window
匿名函数的调用,this指向的是window
对象方法的调用,this指的是该对象,且是最近的对象(向上找
构造函数的调用,this指的是实例化的新对象
apply和call调用,this指向参数中的对象
bind调用, bind会复制一个新的函数并且将这个this指向参数中的对象
在箭头函数和对象的属性中this的指向会指向上下文中this的指向
// this --->document
var obj={
a:10,
c:50,
b:{
a:0,
c:this.a,
run:function(){
console.log(this.c);
}
}
}
特殊:
如果一个函数中有this,这个函数中包含多层对象,不管有几层调用,this指向的也只是它上一级的对象。
new关键字会创建一个空的对象,然后会调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。
利用arguments的参数来执行回调函数,
被执行的回调函数中this指向的是当前函数arguments.callee.caller函数的arguments
arguments.callee:被调用时指向函数自身。
caller:指向调用某函数的那个函数。
fn中的this是fn1中arguments
var a;
function fn(){
console.log(this===a);
}
function fn1(f){
a=arguments;
arguments[0]();
}
fn1(fn);
总结
我们要知道this可以使用call、apply、bind自己强制绑定 ,当没有绑定的时候他会自己寻找默认绑定window或者隐式绑定调用它的对象并且是直接调用它的对象而不是最外围调用它的对象,记住是自己调用的对象不是最外围,尤其是嵌套中。this只要经常熟练使用并没有那么难,而且我们还有箭头函数来帮助我们,并且在严格模式取消了指向window 而是undefined;