用最简单的方法判断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 相关文章推荐
JavaScipt基本教程之前言
Jan 16 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
Apr 25 Javascript
JQuery UI的拖拽功能实现方法小结
Mar 14 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
Mar 09 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 Javascript
微信小程序实现左右列表联动
May 19 Javascript
Windows上node.js的多版本管理工具用法实例分析
Nov 06 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
JQuery表单元素取值赋值方法总结
May 12 jQuery
使用原生javascript开发计算器实例代码
Feb 21 Javascript
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将数据导入到Foxmail
2006/10/09 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
javascript操作数组详解
2014/12/17 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
深入学习python的yield和generator
2016/03/10 Python
python爬虫的工作原理
2017/03/05 Python
Django中使用Celery的方法示例
2018/11/29 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
基于PyTorch中view的用法说明
2021/03/03 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
上课打牌的检讨书
2014/02/15 职场文书
三好生演讲稿
2014/09/12 职场文书