用最简单的方法判断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 相关文章推荐
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
Dec 27 Javascript
js和jquery中循环的退出和继续学习记录
Sep 06 Javascript
JavaScript判断是否为数字的4种方法及效率比较
Apr 01 Javascript
通过正则表达式获取url中参数的简单实现
Jun 07 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
Jun 16 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
Jan 22 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
Oct 21 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
Mar 19 Javascript
vue里如何主动销毁keep-alive缓存的组件
Mar 21 Javascript
JS实现百度搜索框关键字推荐
Feb 17 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
python多线程http下载实现示例
2013/12/30 Python
Cpy和Python的效率对比
2015/03/20 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
python定时关机小脚本
2018/06/20 Python
python获取地震信息 微信实时推送
2019/06/18 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
python实现猜拳小游戏
2020/04/05 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
秘书专业自荐信范文
2013/12/26 职场文书
小学敬老月活动方案
2014/02/11 职场文书
《大海那边》教学反思
2014/04/09 职场文书
五好关工委申报材料
2014/05/31 职场文书
社区创先争优承诺书
2014/08/30 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2014年实验室工作总结
2014/12/03 职场文书
新郎接新娘保证书
2015/05/08 职场文书
孔子观后感
2015/06/08 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js