用最简单的方法判断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 相关文章推荐
JavaScript 应用技巧集合[推荐]
Aug 30 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
JavaScript 产生不重复的随机数三种实现思路
Dec 13 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
Aug 15 Javascript
javascript之Array 数组对象详解
Jun 07 Javascript
vue.js 上传图片实例代码
Jun 22 Javascript
webpack构建vue项目的详细教程(配置篇)
Jul 17 Javascript
解决layer弹出层msg的文字不显示的问题
Sep 11 Javascript
浅谈vue异步数据影响页面渲染
Oct 29 Javascript
JavaScript实现五子棋小游戏
Oct 26 Javascript
微信小程序实现日历小功能
Nov 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
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
php远程下载类分享
2016/04/13 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
vue初始化动画加载的实例
2018/09/01 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
python机器学习之决策树分类详解
2017/12/20 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
网络教育自我鉴定
2013/11/01 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
七年级数学教学反思
2016/02/17 职场文书
无线电通信名词解释
2022/02/18 无线电