用最简单的方法判断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 相关文章推荐
使用jQuery清空file文件域的解决方案
Apr 12 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
javascript类型转换使用方法
Feb 08 Javascript
Node.js模拟浏览器文件上传示例
Mar 26 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 jQuery
bootstrap日期插件daterangepicker使用详解
Oct 19 Javascript
javascript实现数字配对游戏的实例讲解
Dec 14 Javascript
小程序实现单选多选功能
Nov 04 Javascript
javascript实现贪吃蛇游戏(娱乐版)
Aug 17 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
vue3使用vue-router的完整步骤记录
Jun 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』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
Bootstrap 网格系统布局详解
2017/03/19 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
微信小程序3D轮播实现代码
2019/09/19 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
Python open()文件处理使用介绍
2014/11/30 Python
Python中类型检查的详细介绍
2017/02/13 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
AJAX的全称是什么
2012/11/06 面试题
2013的个人自我评价
2013/12/26 职场文书
驾驶员岗位职责
2014/01/29 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
作文评语怎么写
2014/12/25 职场文书
订货会邀请函
2015/01/31 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
复兴之路展览观后感
2015/06/02 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
html实现弹窗的实例
2021/06/09 HTML / CSS