当前位置:首页 > 日记 > 正文

JavaScript 中的 this 简单规则

JavaScript 中的 this 简单规则

几条规则确定函数里的 this 是什么。

想确定 this 是什么其实非常简单。总体的规则是,通过检查它的调用位置,在函数被调用的的时候确定 this。它遵循下面这些规则,接下来以优先级顺序说明。

规则

1、如果在调用函数时使用 new 关键字,那么函数里的 this 就是一个全新的对象。

function ConstructorExample() {  console.log(this);  this.value = 10;  console.log(this);}new ConstructorExample();// -> {}// -> { value: 10 }

2、如果使用 apply、call 或者 bind 调用函数,那么函数里的 this 就是作为参数传进去的对象。

function fn() {  console.log(this);}var obj = {  value: 5};var boundFn = fn.bind(obj);boundFn();   // -> { value: 5 }fn.call(obj); // -> { value: 5 }fn.apply(obj); // -> { value: 5 }

3、如果函数作为一个方法调用,就是说如果使用点符号调用函数,那么 this 就是拥有这个函数作为属性的对象。换句话说,当一个点在函数调用的左侧时,this 就是这个点左侧的那个对象。

var obj = {  value: 5,  printThis: function() {    console.log(this);  }};obj.printThis(); // -> { value: 5, printThis: ? }

4、如果函数作为一个纯粹的函数调用,也就是说,它在没有上述任何条件的情况下被调用,那么 this 就是全局对象。在浏览器里,就是 window 对象。

function fn() {  console.log(this);}// 如果在浏览器里调用:fn(); // -> Window {stop: ?, open: ?, alert: ?, ...}

注意这个规则其实和第三个规则是一样的,区别在于没有声明为方法的函数会自动成为全局对象 window 的属性。因此,这其实是一个隐式的方法调用。当我们调用 fn(),其实就会被浏览器理解为 window.fn(),所以 this 就是 window。

console.log(fn === window.fn); // -> true

5、如果上述规则有多个适用,那么优先级更高的就会设置 this 值。

6、如果是 ES2015 里的箭头函数,那么它将忽略上述所有规则,并在创建的时候接收包含它的作用域作为 this 的值。想确定 this 具体是什么的话,只需从创建箭头函数那里往上一行,看看那儿的 this 是什么,箭头函数里的 this 值和它一样。

const obj = {  value: 'abc',  createArrowFn: function() {    return () => console.log(this);  }};const arrowFn = obj.createArrowFn();arrowFn(); // -> { value: 'abc', createArrowFn: ? }

看回第三个规则,当我们调用 obj.createArrowFn() 的时候,createArrowFn 里的 this 是 obj,因为这是方法调用。因此,obj 会在 arrowFn 里绑定到 this 上。如果我们在全局作用域创建一个箭头函数,那么 this 值就会是 window。

应用规则

让我们来看一个代码示例,并应用这些规则。尝试一下看能否弄清楚不同的函数调用下,this 是什么。

确定应用了哪条规则

var obj = {  value: 'hi',  printThis: function() {    console.log(this);  }};var print = obj.printThis;obj.printThis(); // -> {value: "hi", printThis: ?}print(); // -> Window {stop: ?, open: ?, alert: ?, ...}

obj.printThis() 属于第三条规则,方法调用。另一方面,print() 属于第四条规则,纯粹的函数调用。对于 print() 来说,我们在调用的时候没有使用 new、bind/call/apply 或者点符号,所以它对应了规则四,this 就是全局对象 window。

当适用多个规则的时候

当适用多个规则的时候,使用列表里更高优先级的规则。

var obj1 = {  value: 'hi',  print: function() {    console.log(this);  },};var obj2 = { value: 17 };

如果规则二和规则三同时适用,那么规则二占优。

obj1.print.call(obj2); // -> { value: 17 }

如果规则一和规则三同时适用,那么规则一占优。

new obj1.print(); // -> {}

有些库有时候会故意将 this 值绑定到某些函数里。而通常会在函数里将最有用的值绑定到 this 上使用。举个例子,jQuery 把 this 绑定到 DOM 元素上,在回调中触发一个事件。如果某个库出现一个不太符合上述规则的 this 值,那么请仔细阅读这个库的文档,它很有可能使用 bind 绑定了。

总结

以上所述是小编给大家介绍的JavaScript 中的 this 简单规则,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

相关文章

ps cs6怎么给照片添加阴影线效果?

ps cs6怎么给照片添加阴影线效果?

照片,效果,电脑软件,ps,一张数码照片制作成阴影线效果。软件名称:Photoshop CS6 13.0 破解版 中文绿色免费版 (PSCS6中文绿色版)软件大小:160MB更新时间:2014-05-151、启动软件,打开一张图片。 2、菜单栏依次选择”图像“—&mda…

Visual Studio for Mac版 初体验

Visual Studio for Mac版 初体验

初体验,电脑软件,Visual,Studio,Mac,你喜爱的 IDE,现在可用于 Mac。因为在 Visual Studio for Mac 之前,已经有了 Visual Studio Code for Mac,那时候我们还以为 Visual Studio Code 就是 Visual Studio 的跨平台版本,但事实微软并不是这样想的…

微信小程序 两种滑动方式(横向滑动,

微信小程序 两种滑动方式(横向滑动,

竖向,实例代码,横向滑动,两种,方式, 微信小程序 滑动方式竖向滑动:<scroll-view scroll-y="true" style="height: 200rpx;"><view style="background: red; width: 200px; height: 100px; display: inline-block" ></view><view style…

原生js封装添加class,删除class的

原生js封装添加class,删除class的

删除,封装,原生,实例,电脑软件,一、添加classfunction addClass(ele,cName) { var arr = ele.className.split(' ').concat(cName.split(" ")); for(var i=0;i<arr.length;i++){ for(var k=arr.length-1;k>i;k--){ (arr[k]==="")&…

PS怎么绘制一个杯子中的小狗?

PS怎么绘制一个杯子中的小狗?

绘制,杯子,小狗,电脑软件,PS,想要绘制一个把头从杯子中露出来的小狗,该怎么制作这个效果呢?下面我们就来看看详细的教程。软件名称:Adobe photoshop 7.01 官方正式简体中文版软件大小:154MB更新时间:2013-04-191、先用钢笔绘制出这个萌小狗的形…

wps电子表格怎样插入表头

wps电子表格怎样插入表头

表头,方法,电子表格,表格,电脑软件,  在Excel中制作表格,有很多情况下都需要制作画有斜线的表头,或许有些初学者的朋友不怎么懂插入表头。下面小编马上就告诉大家wps表格做表头的方法吧。wps表格做表头的方法wps表格做表头的步骤1:首先我们…

详解vue-router和vue-cli以及组件

详解vue-router和vue-cli以及组件

传值,组件,详解,电脑软件,cli,首先简单介绍使用vue-router的四个基本步骤:(为了方便演示,所有代码都写在一个文件里)1.定义组件2.定义路由3.创建router实例并将定义好的路由传入4.创建和挂载根实例再来说一下vue-cli一、安装vue-cli脚手架工具c…

Asp.Net使用服务器控件Image/Image

Asp.Net使用服务器控件Image/Image

显示,方法,服务器控件,电脑软件,Asp, Image/ImageButton服务器控件显示本地的图片 。 这里,我做的是: 数据库中存放了图片的相对地址,读取数据库中的地址,用控件加载显示图片。 步骤:A 、添加服务器控件, 这里以 Image控件为例。B、 数据…

Excel中如何使用COUNTIF函数的计算

Excel中如何使用COUNTIF函数的计算

计算,函数,如何使用,电脑软件,Excel,  Excel表格中的数据很多,我们可能会对里面满足某一特定条件的数据进行函数统计。需要统计学生成绩之类的数值,我们可以使用COUNTIF函数计算。以下是小编为您带来的关于Excel中使用COUNTIF函数的计算,希…

干货:毕业季ps证件照抠图换底色的

干货:毕业季ps证件照抠图换底色的

方法,抠图,干货,底色,三种,干货:毕业季ps证件照抠图换底色的三种方法,自己动手不求人!本次教程共分享了三种纯色背景快速换背景方法,适用各种证件照换色,这三种方法是:利用快速蒙版工具抠图换底、利用色彩范围抠图换底和通道抠图换底,具体操作步…

ps怎么绘制抽象的天眼图案?

ps怎么绘制抽象的天眼图案?

绘制,抽象,天眼,图案,电脑软件,ps滤镜功能可以制作出很多图案,今天我们就来看看详细的制作方法。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、首先启动Photoshop cs5,执行文件-新建命令,新建一个分辨…

正则表达式与HTML5新元素

正则表达式与HTML5新元素

正则表达式,新元素,电脑软件,ProcessOn是一个在线协作绘图平台,为用户提供最强大、易用的作图工具!它可以很方便的在线简单绘制一些东西,让自己去具体理解。正则表达式今日的正则只是学习正则的简单使用。在HTML5的标签属性的强大面前,我们已…