将函数接收器默认为全局对象的理由是什么?

Ben*_*Ben 14 javascript

在JavaScript的早期版本中,将receiver(又名context)默认为全局对象背后的基本原理是什么?

function a() {
  console.log(this); // window
}
Run Code Online (Sandbox Code Playgroud)

Ori*_*iol 6

Brendan Eich 回答道:

因此,顶级函数(第一个版本中唯一的函数)可以充当窗口或框架(后来的iframe)方法.仍在使用.

JS术语:"接收器"是影响JS的语言中的标准OO术语,而不是高度重载的"上下文".

问题提交给Brendan Eich:

所以ES1没有方法?(参见你对顶级fns的评论)

Brendan Eich:

不,JS9在'95(之后没有"ES")通过函数值属性获得方法,但所有函数都是顶级的.ES1标准化.

'99中的ES3添加了函数表达式和嵌套函数(闭包),我在那10天没有时间实现.

要回到orig q:在窗口w中,函数m(){}使wm()可以从具有this== w的其他可到达窗口/帧调用.

  • 我想,一种解释是像`window.addEventListener`这样的方法是一种"窗口方法".他们希望人们能够编写不依赖于`window`全局对象的*new*window方法(`window.addSuperTurboEventlistenerTournamentEdition`).因此,当添加新的顶级函数(他们最初考虑的唯一类型)时,它被视为"窗口方法".我认为这种方式很有意义,因为JavaScript作为一种语言几乎没有意义. (3认同)