用最简单的方法判断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 相关文章推荐
CLASS_CONFUSION JS混淆 全源码
Dec 12 Javascript
javaScript 判断字符串是否为数字的简单方法
Jul 25 Javascript
artDialog双击会关闭对话框的修改过程分享
Aug 05 Javascript
jquery form 加载数据示例
Apr 21 Javascript
document.forms用法示例介绍
Jun 26 Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 Javascript
JS闭包可被利用的常见场景小结
Apr 09 Javascript
Bootstrap table使用方法总结
May 10 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
基于JavaScript实现控制下拉列表
May 08 Javascript
原生微信小程序开发中 redux 的使用详解
Feb 18 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
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
php中cookie的作用域
2008/03/27 PHP
PHP里的中文变量说明
2011/07/23 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
详解Node 定时器
2018/02/26 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
python3实现短网址和数字相互转换的方法
2015/04/28 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
python对XML文件的操作实现代码
2020/03/27 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
为什么需要版本控制
2016/10/28 面试题
幼儿园六一活动总结
2014/08/27 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
学校就业保障协议书
2019/06/24 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang