用最简单的方法判断JavaScript中this的指向(推荐)
都说JavaScript是一种很灵活的语言,这其实也可以说它是一个混乱的语言。它把函数式编程和面向对象编程糅合一起,再加上动态语言特性,简直强大无比(其实是不能和C++比的,^_^)。
JS里的this
- 在function内部被创建
- 指向调用时所在函数所绑定的对象(拗口)
- this不能被赋值,但可以被call/apply 改变
目录
*一个特例
*开始判断
*法则一:对象方法中的this指向对象本身(箭头函数形式的除外)
*法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this
*法则三:箭头函数以及非指向对象方法中的function的情况下this指向window
*习题集
*普通函数中的this
*函数执行后返回另外一个函数中的this(普通函数中)
*多层嵌套函数中的this(定时器&箭头函数)1
*多层嵌套函数中的this(定时器&箭头函数)2
一个特例
在正式开始之前,我们先来说一个特例。
//构造函数 functionStudent(name){ this.name=name } //创建小明和小红两个实例 varXM=newStudent('xiaoming') varXH=newStudent('xiaohong') //输出信息 console.log(XM)//Student{name:"xiaoming"} console.log(XH)//Student{name:"xiaohong"}
在构造函数中,this上的值会在创建实例的时候被绑定到新创建的实例上。不适用于下面的判断方法,所以特此说明。
开始判断
下面是一个典型例子,我们的分析从这里开始。
varx={ name:'bw2', getName1:function(){ console.log(this) }, getName2:function(){ setTimeout(()=>{ console.log(this) },0) }, getName31:()=>{ console.log(this) }, getName32:function(){ returnfunction(){ 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指向对象本身(箭头函数形式的除外)
varx={ name:'bw2', getName1:function(){ console.log(this) } } x.getName1()//{name:"bw2",getName1:ƒ}
法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this
箭头函数没有独立的this作用域,所以继续往外层走,走到了getName:function(){}。那么就是他了,this指向等同于这个function内部的this指向。根据法则一,this指向对象本身。
varx={ 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,所以,指向全局。
是不是感觉有点奇怪?不过实践证明确实如此。
varx={ name:'bw2', getName31:()=>{ console.log(this) }, getName32:function(){ returnfunction(){ console.log(this) } } } x.getName31()//Window{stop:ƒ,open:ƒ,alert:ƒ,confirm:ƒ,prompt:ƒ,…} x.getName32()()//Window{stop:ƒ,open:ƒ,alert:ƒ,confirm:ƒ,prompt:ƒ,…}
习题集
欢迎大家按照法则一到三依次判断,猜测结果,并在浏览器下测试。测试结果也可以回复,大家一起讨论。
因本人能力有限,该系列法则可能在部分情况下失效。欢迎大家一起讨论。
下面是做题时间。
普通函数中的this
functionx(){ console.log(this) } x()
函数执行后返回另外一个函数中的this(普通函数中)
functionxx(){ returnfunction(){ console.log(this) } } xx()()
多层嵌套函数中的this(定时器&箭头函数)1
varx={ name:'bw2', getName:()=>{ setTimeout(()=>{ console.log(this) },0) } } x.getName()
多层嵌套函数中的this(定时器&箭头函数)2
varx={ name:'bw2', getName:()=>{ setTimeout(function(){ console.log(this) },0) } } x.getName()
再次说明,该法则为实验性法则,未进行大范围的测试,不保证在所有情况下都有一致的结果。如果你发现了法则判断失败的情况,欢迎留言,一起探讨。
总结
以上所述是小编给大家介绍的Mysql5.7.19winx64ZIPArchive安装及使用教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!