JavaScript函数调用desugar

JavaScript函数调用desugar,javascript,call,syntactic-sugar,Javascript,Call,Syntactic Sugar,我发现一篇文章说JavaScript函数调用实际上只是func.call(…)的一种语法糖 我想问一下这是否真的是真的,因为我在规范中没有找到类似的东西(没有真正彻底地检查它,只是简单地浏览一下并搜索单词call()) 如果有人能启发我,那就太好了,因为如果这篇文章是真的,我对EcmaScript语言的钦佩可能会减少。我明白为什么这篇文章会这么说,而且在某种程度上是这样的 他们可能声称这是因为函数在直接使用时是未绑定的,这意味着如果我创建一个对象: const a={say:function(

我发现一篇文章说JavaScript函数调用实际上只是
func.call(…)
的一种语法糖

我想问一下这是否真的是真的,因为我在规范中没有找到类似的东西(没有真正彻底地检查它,只是简单地浏览一下并搜索单词
call()


如果有人能启发我,那就太好了,因为如果这篇文章是真的,我对EcmaScript语言的钦佩可能会减少。

我明白为什么这篇文章会这么说,而且在某种程度上是这样的

他们可能声称这是因为函数在直接使用时是未绑定的,这意味着如果我创建一个对象:

const a={say:function(){console.log(this.message)};
a、 消息='你好';
a、 say()
调用函数时(通过调用表达式,例如foo()或使用Call和apply方法),每个函数的[[Call]]内部方法都会被激活。
~Dmitry Soshnikov,关于
.bind


仅为某些对象定义的内部特性 内部属性-
[[Call]]

描述-执行与对象关联的代码。通过函数调用表达式调用。参数是
this
对象和包含传递给函数调用表达式的
参数的列表。实现此内部方法的对象是可调用的

~见带注释的ECMAScript 5.1中的表9 另请参见,
13.2.1[[Call]]

绑定,
15.3.4.5.1,5[[调用]]

这里定义的所有步骤当然都是内部的,因此不会发生实际的“去糖化”转换,但这些内部步骤确实与之类似


tl;博士 我想简而言之,你可以把他在文章中说的看作是

如何模仿屋顶下发生的事情以更好地理解这个概念


对任何想在这个问题上打-1分的人来说,我愿意讨论,我很高兴知道,为什么否决这个问题如此重要?我现在正在写一个答案。我认为这是一个非常合适的问题。“在ES5规范中,调用方法是用另一个更低级的原语来描述的,但它是在原语之上的一个非常薄的包装,所以我在这里简化了一点。”-是的,通过简化,这是正确的。提示:作者所说的原语是
[[Call]]
,但就我对该语言的理解而言,它并不等于Function.prototype.Call。更重要的是,我测试了Typescript编译器,并让它生成与ES3兼容的结果(它所能产生的最低结果),而这并不是本文作者提到的去糖化。这并不是真的去糖化/运输/等等。它只是
obj的一个函数。func()
导致
obj
成为
func
的上下文。因此,从实际意义上讲,您可以说它与
obj.func.call(obj)
相同,但它不会实际对代码本身进行去糖/传输。谢谢您的回答。似乎有点误会。我完全同意你的看法,因为整个“动态此”机制是一个出色的设计解决方案。我的问题是javascript运行时是“按原样”使用foo(111),还是必须做过多的工作,并在代码的每个地方都将此调用更改为foo.call(global,111),但这不是很多工作。它只是在运行时确定上下文,这是一件非常简单的事情。就像
global/window
级别的所有其他内容一样,
global
在这样的调用中是隐含的,因此上下文是全局的,但要确定这一点实际上并不需要任何工作。它没有改变,只是函数执行时的一个决定。它有没有可能影响程序的执行性能(我假设是即时编译,然后立即执行)?没有。这是JS的一个基本问题,所以它会很快。您运行的每件事都有一个上下文,并且该上下文总是已知的。在那篇文章中,当他谈到去糖化时,他实际上只是出于说明的目的。这甚至不是JIT编译。这只是一个查找。这就是函数的工作原理。这和OO语言如何确定类方法的上下文并没有什么不同。非常感谢!接受你的回答,如果你不介意的话。现在我正处于探索语言深层次的边缘,不幸的是,我的问题并不是每一个都能得到如此完整的答案。我想知道你们是否可以推荐一些值得研究的东西,因为现在MDN还不够,而且阅读规范仍然很痛苦。再次感谢