用最简单的方法判断JavaScript中this的指向(推荐)


Posted in Javascript onSeptember 04, 2017

都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言。它把 函数式编程 和 面向对象编程 糅合一起,再加上 动态语言 特性,简直强大无比(其实是不能和C++比的,^_^ )。

JS 里的 this

  • 在 function 内部被创建
  • 指向调用时所在函数所绑定的对象(拗口)
  • this 不能被赋值,但可以被 call/apply  改变

目录

* 一个特例
* 开始判断
    * 法则一:对象方法中的this指向对象本身(箭头函数形式的除外)
    * 法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this
    * 法则三:箭头函数以及非指向对象方法中的function的情况下this指向window
* 习题集
    * 普通函数中的this
    * 函数执行后返回另外一个函数中的this(普通函数中)
    * 多层嵌套函数中的this(定时器&箭头函数)1
    * 多层嵌套函数中的this(定时器&箭头函数)2

一个特例

在正式开始之前,我们先来说一个特例。

// 构造函数
function Student(name) {
 this.name = name
}
// 创建小明和小红两个实例
var XM = new Student('xiaoming')
var XH = new Student('xiaohong')
// 输出信息
console.log(XM) // Student {name: "xiaoming"}
console.log(XH) // Student {name: "xiaohong"}

在构造函数中,this上的值会在创建实例的时候被绑定到新创建的实例上。不适用于下面的判断方法,所以特此说明。

开始判断

下面是一个典型例子,我们的分析从这里开始。

var x = {
 name: 'bw2',
 getName1: function() {
 console.log(this)
 },
 getName2: function() {
 setTimeout(() => {
  console.log(this)
 },0)
 },
 getName31: () => {
 console.log(this)
 },
 getName32: function() {
 return function() {
  console.log(this)
 }
 }
}
x.getName1() // {name: "bw2", getName1: ƒ}
x.getName2() // {name: "bw2", getName1: ƒ}
x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}

法则一:对象方法中的this指向对象本身(箭头函数形式的除外)

var x = {
 name: 'bw2',
 getName1: function() {
 console.log(this)
 }
}
x.getName1() // {name: "bw2", getName1: ƒ}

法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this

箭头函数没有独立的this作用域,所以继续往外层走,走到了getName: function(){}。那么就是他了,this指向等同于这个function内部的this指向。根据法则一,this指向对象本身。

var x = {
 name: 'bw2',
 getName2: function() {
 console.log(this) // 等同于此处的this
 setTimeout(() => {
  console.log(this) // 原始的this位置
 },0)
 }
}
x.getName2() // {name: 'bw2', getName1: ƒ}

我们可以试着在浏览器中运行,看看结果。

法则三:箭头函数以及非指向对象方法中的function的情况下this指向window

根据法则二,this是指向最近的function,因此,这里的this等同于返回的函数中的this,不是对象方法中的this,所以,指向全局。

是不是感觉有点奇怪?不过实践证明确实如此。

var x = {
 name: 'bw2',
 getName31: () => {
 console.log(this)
 },
 getName32: function() {
 return function() {
  console.log(this)
 }
 }
}
x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}

习题集

欢迎大家按照法则一到三依次判断,猜测结果,并在浏览器下测试。测试结果也可以回复,大家一起讨论。

因本人能力有限,该系列法则可能在部分情况下失效。欢迎大家一起讨论。

下面是做题时间。

普通函数中的this

function x() {
 console.log(this)
}
x()

函数执行后返回另外一个函数中的this(普通函数中)

function xx(){
 return function() {
 console.log(this)
 }
}
xx()()

多层嵌套函数中的this(定时器&箭头函数)1

var x = {
 name: 'bw2',
 getName: () => {
 setTimeout(() => {
  console.log(this)
 },0)
 }
}
x.getName()

多层嵌套函数中的this(定时器&箭头函数)2

var x = {
 name: 'bw2',
 getName: () => {
 setTimeout(function() {
  console.log(this)
 },0)
 }
}
x.getName()

再次说明,该法则为实验性法则,未进行大范围的测试,不保证在所有情况下都有一致的结果。如果你发现了法则判断失败的情况,欢迎留言,一起探讨。

总结

以上所述是小编给大家介绍的Mysql 5.7.19 winx64 ZIP Archive 安装及使用教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
从javascript语言本身谈项目实战
Dec 27 Javascript
Add Formatted Text to a Word Document
Jun 15 Javascript
分享bootstrap学习笔记心得(组件及其属性)
Jan 11 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
Feb 24 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
Apr 27 Javascript
微信小程序三级联动地址选择器的实例代码
Jul 12 Javascript
Spring Boot/VUE中路由传递参数的实现代码
Mar 02 Javascript
快速解决brew安装特定版本flow的问题
May 17 Javascript
vue+iview/elementUi实现城市多选
Mar 28 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
Sep 14 Javascript
Vue左滑组件slider使用详解
Aug 21 Javascript
vue使用节流函数的踩坑实例指南
May 20 Vue.js
JS与HTML结合实现流程进度展示条思路详解
Sep 03 #Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
Sep 03 #Javascript
JS实现页面内跳转的简单代码
Sep 03 #Javascript
初探JavaScript 面向对象(推荐)
Sep 03 #Javascript
jquery+css实现下拉列表功能
Sep 03 #jQuery
使用JavaScript实现点击循环切换图片效果
Sep 03 #Javascript
jQuery中.attr()和.data()的区别分析
Sep 03 #jQuery
You might like
使用php+xslt在windows平台上
2006/10/09 PHP
PHP脚本数据库功能详解(上)
2006/10/09 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
javascript断点调试心得分享
2016/04/23 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
会计主管岗位职责范文
2013/11/08 职场文书
班组长安全生产职责
2013/12/16 职场文书
自荐书4要点
2014/01/25 职场文书
职位说明书范文
2014/05/07 职场文书
英文版辞职信
2015/02/28 职场文书
参加招聘会后的感想
2015/08/10 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript