用最简单的方法判断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实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
Mar 21 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
Feb 12 Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
Mar 01 Javascript
很棒的一组js图片轮播特效
Jan 12 Javascript
jQuery实现标签页效果实战(4)
Feb 08 Javascript
JavaScript 中调用 Kotlin 方法实例详解
Jun 09 Javascript
Bootstrap Table从零开始
Jun 30 Javascript
node.js实现微信开发之获取用户授权
Mar 18 Javascript
p5.js实现简单货车运动动画
Oct 23 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
Nov 12 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
Feb 07 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中过滤非法字符的具体实现
2013/10/29 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
PHP7新增函数
2021/03/09 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
深入讲解Java编程中类的生命周期
2016/02/05 Python
Python高级用法总结
2018/05/26 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
python Django的web开发实例(入门)
2019/07/31 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
Python实现名片管理系统
2020/02/14 Python
Python super()方法原理详解
2020/03/31 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
迟到检讨书5000字
2014/01/31 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
小学生反邪教心得体会
2016/01/15 职场文书