javascript this什么意思,javascript的this用法

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: