首页 > 语言 > JavaScript > 正文

JavaScript中this的用法及this在不同应用场景的作用解析

2024-05-06 15:18:31
字体:
来源:转载
供稿:网友

由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。

JavaScript 中函数的调用有以下几种方式:作为函数调用,作为对象方法调用,作为构造函数调用,和使用 apply 或 call 调用。下面我们将按照调用方式的不同,分别讨论 this 的含义。

情况一:纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。

1、函数也可以直接被调用,此时 this 绑定到全局对象。

function makeNoSense(x) {   this.x = x; } makeNoSense(5); console.log(x);// x 已经成为一个值为 5 的全局变量function test(){  this.x = 1;  alert(this.x);}test(); // 1

情况二:作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this指代对象内部属性被调用。

var myObject = {  value :0,  increment:function (inc){    this.value += typeof inc ==='number' ? inc:1;  }};myObject.increment();console.log(myObject.value); //1myObject.increment(2);console.log(myObject.value); //3

情况三 :作为构造函数调用

javaScript 支持面向对象式编程,与主流的面向对象式编程语言不同,JavaScript 并没有类(class)的概念,而是使用基于原型(prototype)的继承方式。

相应的,JavaScript 中的构造函数也很特殊,如果不使用 new 调用,则和普通函数一样。作为又一项约定俗成的准则,构造函数以大写字母开头,提醒调用者使用正确的方式调用。如果调用正确,this 绑定到新创建的对象上。

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

function Point(x, y){   this.x = x;   this.y = y;  }var p1 = new Point(3,2);console.log(p1.x+","+p1.y);//3,2

为了表明这时this不是全局对象,我对代码做一些改变:

var x = 4;function Point(x, y){   this.x = x;   this.y = y;  }var p1 = new Point(3,2);console.log(p1.x+","+p1.y);//3,2

情况四: apply或call调用

让我们再一次重申,在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。很多 JavaScript 中的技巧以及类库都用到了该方法。让我们看一个具体的例子:

function Point(x, y){   this.x = x;   this.y = y;   this.moveTo = function(x, y){     this.x = x;     this.y = y;     console.log(this.x+","+this.y);  } } var p1 = new Point(0, 0); var p2 = {x: 0, y: 0}; p1.moveTo(1, 1); //1,1p1.moveTo.apply(p2, [10, 10]);//10,10            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选