javascript this什么意思,javascript的this用法
JavaScript的奇妙this:
this是什么?
:
指向函数本身?
从字面上看,很容易认为这是指向函数本身。真的是这样吗?我们可以看一个例子。
函数foo() {
this.count=this.count?this . count 1:1;
}
for(设I=0;i5;i ) {
foo();
}
console . log(foo . count);//undefined你可以看到foo.count的输出并不是我们预期的5,而是一开始赋值的0。也就是this其实并没有指向函数本身。
指向作用域?
另一个常见的误解是,这指向函数的范围。
函数foo() {
var a=2;
bar();
}
功能栏(){
console . log(this . a);
}
foo();//这段代码中未定义,bar在foo中运行,但输出this.a时未定义。也就是this也不是指向函数的作用域的。
既不是这个也不是那个。这到底是什么?在一个函数的执行过程中,会创建一个执行上下文(一条记录),这是这个上下文中的一个属性,在执行过程中使用。这一点取决于函数被调用的位置。
this的绑定规则
这个绑定有四个可以遵循的规则,下面逐一介绍。
1.默认绑定
独立函数调用,指向窗口;在非严格模式下;在严格模式下指向未定义。这里说的独立函数,除了后三种情况,可以理解为一般的函数调用。
//非严格模式
var name= Willem
函数foo() {
console . log(this . name);
}
foo();//威廉
//在执行时启用严格模式
(函数(){
使用严格的;
foo();//威廉
bar();//无法读取未定义的属性“name”
})();
//函数体使用严格模式
功能栏(){
使用严格的;
console . log(this . name);
}在上面的代码中,分别在普通环境下输出Willem,说明它确实是一个窗口对象。需要注意的是,在严格模式下指向undefined意味着在函数体中启用严格模式,而不是在调用时启用。
2. 隐式绑定
隐式绑定表示一个函数在执行时是否被一个对象拥有或包含。换句话说,当函数运行时,它是否作为对象的属性运行还不清楚。举个栗子:
函数foo() {
console . log(this . a);
}
var a=1;
var obj={
答:2,
富(中国姓氏)
};
obj . foo();//2
var obj2={
答:3,
目标文件
};
obj 2 . obj . foo();//2在例子中,foo作为obj的属性执行,obj是函数的上下文,这个指向obj,而this.a相当于对象属性链调用中的obj.a,只有最后一层会影响调用位置,也就是说最后一层会影响这个指向。
很多前端的朋友可能在面试的时候看到过这样的问题:
函数foo() {
console . log(this . a);
}
var a=1;
var obj={
答:2,
富(中国姓氏)
};
var bar=obj.foo
bar();//1这是隐式绑定最常见的问题,隐式丢失:被隐式绑定的函数会丢失绑定对象。bar虽然是对obj.foo的引用,但实际上是指foo函数本身,bar函数是独立函数的调用。参考第一个,这个指向windowundefined。
还有一个经典的回调函数,它的这个指向问题也是隐式丢失的。
函数foo() {
console . log(this . a);
}
函数doFoo(fn) {
fn();
}
var a=1;
var obj={
答:2,
富(中国姓氏)
};
doFoo(obj . foo);//1总结:隐式绑定中,在赋值的情况下(回调就是隐式赋值),要特别注意隐式丢失的问题。
3. 显示绑定
JavaScript中的函数提供了两种方法,调用和应用。传入的第一个参数是一个对象,它将这个对象绑定到这个对象。如果传入一个原始值(string、number、Boolean),它将被转换为其对象形式(newstring()、newboolean()、newnumber())。
函数foo() {
console . log(this . a);
}
var obj={
答:1
};
foo . call(obj);//1虽然我们可以使用call和apply来显式指定这一点,但仍然会有失去绑定的问题。可以通过所谓的硬绑定(bind函数)来解决,这里就不赘述了。
4. new
最后要介绍的是用new来修改这个的绑定。手动实现过new的童鞋应该清楚,js的new和其他语言的new是完全不同的。
新的执行过程:
创建一个空对象。当前空对象执行原型停靠返回函数执行结果或当前空对象函数Foo(a) {
this.a=a
}
var bar=new Foo(2);
bar.a//2使用new调用函数时,我们会构造一个新的对象,并在函数调用中绑定到这个。
优先级
最后简单说一下优先级的关系:新显示绑定隐式绑定默认绑定。
推荐:《javascript基础教程》
这就是JavaScript的神奇之处。到底是什么?更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。