您好,欢迎来到百万美食网。
搜索
您的当前位置:首页对JavaScript中this指针的新理解分享_javascript技巧

对JavaScript中this指针的新理解分享_javascript技巧

来源:百万美食网


一直以来对this的理解只在可以用,会用,却没有去深究其本质。这次,借着《JavaScript The Good Parts》,作了一次深刻的理解。(所有调试都可以在控制台中看到,浏览器F12键)

下面我们一起来看看这个this吧。

在我们声明一个函数时,每个函数除了有定义时的parameters(形参),自身还会有额外的两个参数,一个是this,一个是arguments(实参)。arguments就是函数实际接受到的参数,是一个类数组。arguments我只做个简略的介绍,重点我们放在this指针上。

在面向对象变成中,this十分重要,它的值取决于调用的模式。而在JavaScript中,一共有4中调用模式:方法调用模式、函数调用模式、构造函数调用模式、apply调用模式。

方法调用模式

当一个函数是作为一个对象的属性时,我们通常称这个函数是这个对象的一个方法。当这个方法被调用时,this就会指向该方法所属对象。

代码如下:

var people = {
name : "Yika",
sayName : function(){
console.log(this.name); //"Yika"
//this已经绑定在了people对象上了
}
}
people.sayName();

如栗子所示,this指向了sayName对象,这种通过this取得所属对象上下文的方法,就是公共方法。(publice method)

函数调用模式

当一个函数被调用时并非某个对象上的方法,那么它就是作为一个函数被调用的。

这种模式调用,this会指向window对象,即使这个函数或许是在外部函数里调用的,我们来看栗子。

代码如下:

var name = "window-Yika";
var people = {
name : "people-Yika",
student : function(){
console.log(this); //这里的this绑定的是对象people
function sayName(){
var name = "sayName-Yika";
console.log(this.name); //window-Yika
          //即使sayName函数本身和它所在的people对象都有name值,但是this是指向window的
};
sayName();
}
}

people.student();

这样一看,是不是大概知道该怎么解决JavaScript这个“设计错误"了呢。

是的只要在student函数里面,也就是第6行,将this缓存起来。然后再将this通过变量转移到sayName函数里就可以解决啦!

代码如下:
var people = {
name : "people-Yika",
student : function(){
var self = this; //将this缓存起来
function sayName(){
var name = "sayName-Yika";
console.log(self.name); //"people-Yika",此时的self指向的是people对象
};
sayName();
}
}

构造函数调用模式

  JavaScript里一讲到构造函数,脑海里就会有:“函数名大写!调用的时候要用new操作符!” 函数名大写好理解,是为了规范统一构造函数的命名。可是你有没有深究过为什么要用new呢?如果在一个函数前面带上new来调用,那么函数后台会创建一个指向该函数prototype的新对象,同时this也绑定在新对象上。JavaScript是一门基于原型继承的语言,对原型prototype不是很清楚的同学可以自己去查一下资料,我重点放在this上面。

我们先来看看构造函数一般长什么样子。

代码如下:
输出
  }
}
  var Yika = new People("Yika");
Yika.sayName(); //输出“Yika" ,因为Yika是通过new调用得来的,this都绑定在了Yika对象上。

乍一看,好像不是好懂,怎么刚才在函数里的this是指向window,现在不用缓存就可以指向People函数呢?

没关系,刚才不是说函数通过new调用,会在背地里自己做“做坏事”么,我们一起看看到底做了哪些事。

代码如下:
输出"Yika"

这样看就明白清楚了吧,new不仅会生成一个对象,而且还会自动return这个对象,这样自然this便指向了这个新对象。

千万记得要用 new 去调用构造函数,不然出了问题,是没有警告的,所有大写约定还是十分有必要的。

Apply调用模式

apply方法让我们构建一个参数数组传递给调用函数,也允许我们改变this值。

function.apply(this绑定的值, arguments参数数组)

apply可以说的东西太多了,我这里只举个的栗子来帮助大家理解:
代码如下:
输出“Yika”

我们可以通过apply轻易的修改函数的this绑定对象,和apply相似的方法call也有一样的效果,有兴趣的同学可以自己搜索学习一下。

好了,总算讲完改变this的四种调用模式了,方法调用模式和构造函数调用模式会用的更多,也会更重要一点,而函数调用模式,我们则要学会避开其中的陷阱。

若有错误,请及时反映,我会尽快纠正,以防误导他人,谢谢!

百万美食网还为您提供以下相关内容希望对您有帮助:

JavaScript篇:深度解析this指针

JavaScript中的this指针是一个动态绑定的上下文引用,其指向取决于函数的调用方式。 以下是this指针的核心概念、绑定规则、特殊情况及实用技巧的深度解析:1. this指针的基础概念定义与本质this是函数执行时的上下文引用,由调用方式动态决定,而非定义时。其指向可能是全局对象(如window)、对象实例、构造函数创建的实例,或

理解JavaScript 对象和函数中的“this”

1. 全局作用域中的 this浏览器环境:this 指向全局对象 window。var a = 1;console.log(this.a); // 输出 1(this 指向 window)严格模式:this 为 undefined。2. 函数中的 this普通函数调用:非严格模式下,this 指向全局对象(window)。严格模式下,this 为 undefined。function sayHello() { ...

全面理解JS中的this-前端园地

首先,在全局代码中,this固定为全局对象,如window,例如`console.log(this.a)`会输出全局对象的a属性。尝试修改this的值在JavaScript中是不允许的,会抛出错误。函数中的this更为复杂。函数执行前,this已确定,且在运行时保持不变。全局函数的this指向window,如`foo();`会输出window。而作为对象方法...

javascript中的this指的对象是什么?

理解this的要点:关键在于将函数与函数名分开看待。同一个函数,在不同的执行方法下,会有不同的效果。1)全局函数中的this指向 2)对象方法中的this指向 3)绑定函数时的this 4)绑定函数时的this 5)鼠标单击事件等进行函数的绑定时,this的指向 6)setTimeout等传参形式的this指向 7)改变this的...

关于this

关于this的详细解析 一、this的基本概念 this是JavaScript中的一个关键字,它代表函数运行时的一个特殊对象,这个对象在函数被调用时确定。this的指向并不是固定的,而是根据函数的调用方式动态绑定的。二、this的常见错误理解 this是指向自身吗?在函数中使用this时,this并不总是指向函数本身。实际上,...

JS基础系列-聊聊this

1、新生成一个对象(people)2、该对象原型对象指向构造函数的prototype对象(People.prototype)3、通过新生成的对象调用构造函数(可以简单理解为People.call(this))4、作为箭头函数调用 简单例子如下 这个时候打印的我们可能因为都是window对象,然而结果打脸了,第一个打印的是window对象,第二个打印的是...

如何理解 JavaScript 中的 this 关键字

首先,this对象只会在一个函数中需要确定,如果是在全局域下,this永远为Global对象,在浏览器中通常就是window对象。而在javascript中,函数的调用一共有4种方式:Function Invocation Pattern 诸如`foo()`的调用形式被称为Function Invocation Pattern,是函数最直接的使用形式,注意这里的foo是作为单独的...

请教解释一个关于javascript中this的函数。

“通俗易懂些”说说我的理解。js函数是一种对象。new关键字可以将一个函数对象实例化为一个新的对象。被实例化后,源对象内的this将指向这个新的对象,否则如没有用new实例化则this指向默认的顶层对象window。如Test()和new Test()两者的区别:前者仅仅执行一次,this指向window,后者不仅执行一次而且...

js this是什么意思?

在JavaScript中,this关键字指的是当前执行函数的上下文对象,即函数运行时的当前对象。以下是关于this关键字的详细解释:上下文对象:当函数被调用时,JavaScript引擎会自动将this作为第一个参数传递给函数,并将其设置为调用该函数的对象。不同情况下的this值:全局作用域:在全局作用域中运行的函数,其this...

箭头函数的this指向问题-一看就懂

箭头函数的this指向问题是一个关键概念,它涉及到JavaScript函数执行环境中的this变量。箭头函数中的this指向的是定义时的this,而不是执行时的this。这可能导致一些意料之外的行为,理解这一点对于编写可预测、健壮的代码至关重要。让我们通过一个具体的例子来直观地理解箭头函数的this指向。假设我们有一个...

Copyright © 2019- bwgh.cn 版权所有

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务