本文深入解析JavaScript中匿名函数的this指向问题。通过案例说明this在定义时不确定,执行时由调用者决定。重点分析普通方法调用与返回匿名函数在全局执行时的差异,并介绍使用bind等方法改变this指向的技巧,帮助开发者理解并解决相关困惑。
前言
前言
匿名函数的全局性探讨
网络上常有观点认为匿名函数的执行具有全局性,那么这种全局性具体是如何体现的呢?
this指向的确定时机
在函数定义阶段,this的指向是无法确定的,只有当函数真正执行时,才能确定this最终指向谁。实际上,this最终指向的是调用它的那个对象。
案例演示与结果分析
在第一个案例中,调用sayOne输出的是Alan,而调用sayTwo则输出window。
代码示例
var name = 'window'
var person = {
name :'Alan',
sayOne:function () {
console.log(this.name)
},
sayTwo:function () {
return function () {
console.log(this.name)
}
}
}
person.sayOne()//Alan
person.sayTwo()() // window
原因解析
造成这一现象的原因如下:
- 函数内部的this指向其调用者。
- sayOne的调用者是person对象,因此this指向person。
- sayTwo虽然也是由person对象调用,但区别在于它并没有直接输出this,而是返回了一个匿名函数。
- 这个返回的匿名函数并非作为某个对象的方法被调用,而是在全局上下文中执行。
改变this指向的方法
此外,我们也可以手动更改this的指向,以下应用《JavaScript高级程序设计》中的案例进行说明。
高级编程案例
var name = "global";
var foo = {
name: "foo",
getName : function(){
console.log(this.name);
}
}
var bar = {
name: "bar",
getName : function(){
return (function(){
console.log(this.name);
})();
}
}
foo.getName(); //foo
foo.getName.call(bar); //bar
foo.getName.call(this); //global
foo.getName.call(window); //global
(function(){
console.log(this.name)
}.bind(bar))(); //bar
(function(){
console.log(this.name)
}.bind())(); //global
总结
总结
结语
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。