JS匿名函数内部this指向问题详析

作者:闭包旅人时间:2026-10-23 07:02:39浏览:409

本文深入解析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 

原因解析

造成这一现象的原因如下:

  1. 函数内部的this指向其调用者。
  2. sayOne的调用者是person对象,因此this指向person。
  3. sayTwo虽然也是由person对象调用,但区别在于它并没有直接输出this,而是返回了一个匿名函数。
  4. 这个返回的匿名函数并非作为某个对象的方法被调用,而是在全局上下文中执行。

改变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

总结

总结

结语

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。

作者最新文章

相关标签: