用最简单的方法判断JavaScript中this的指向(推荐)
都说 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上的值会在创建实例的时候被绑定到新创建的实例上。不适用于狼蚁网站SEO优化的判断方法,所以特此说明。
开始判断
狼蚁网站SEO优化是一个典型例子,我们的分析从这里开始。
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 {s: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …} x.getName32()() // Window {s: ƒ, 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 {s: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …} x.getName32()() // Window {s: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
习题集
欢迎大家按照法则一到三依次判断,猜测结果,并在浏览器下测试。测试结果也可以回复,大家一起讨论。
因本人能力有限,该系列法则可能在部分情况下失效。欢迎大家一起讨论。
狼蚁网站SEO优化是做题时间。
普通函数中的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 安装及使用教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,长沙网络推广会及时回复大家的。在此也非常感谢大家对狼蚁SEO网站的支持!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程