Javascript 当我调用一个函数时,到底发生了什么?

Javascript 当我调用一个函数时,到底发生了什么?,javascript,Javascript,这可能是一个简单的问题,但我最近一直在思考。我已经试着寻找答案,但还没有找到令人满意的答案。 基本上,当我调用函数时,幕后发生了什么?说:- function sayHello(){ console.log('hello'); } sayHello(); //what's happening here? 我知道做sayHello.call()或sayHello.apply()与执行sayHello()相同但是,关于在神秘的本机代码下面发生了什么,或者是在神秘的本机代码后面发生了什么,还

这可能是一个简单的问题,但我最近一直在思考。我已经试着寻找答案,但还没有找到令人满意的答案。
基本上,当我调用函数时,幕后发生了什么?说:-

function sayHello(){
    console.log('hello');
}
sayHello(); //what's happening here?

我知道做
sayHello.call()
sayHello.apply()
与执行
sayHello()相同但是,关于在神秘的本机代码下面发生了什么,或者是在神秘的本机代码后面发生了什么,还有更多的信息吗?

下面是解释器在进行JS函数调用时所做的一些事情:

  • 将创建一个新的范围对象。创建并放置arguments对象 将任何参数传递到中的函数中 它
  • 新函数中的所有局部变量都被放入范围中 反对
  • 对下一行代码的引用被推送到执行中 堆栈(以便解释器知道在函数 返回)
  • 此指针的设置是适当的
  • 执行被转移到函数的代码中
这是由JS解释器(它的许多工作之一)的内部管理的,它可能是本机代码



如果您想在调用函数
B()
的任何时候调用函数
A()
,您可以使用自己的代理来替换函数
A()
,该代理调用函数
B()
,然后调用原始的
A()

,这是关于调用和应用之间的差异以及它们对上下文的影响的问题(又名本)呵呵,确实有-但是
控制台。log
是本机代码,因为它是由浏览器作为主机api提供的。您在寻找什么?创建一个新的范围对象。创建一个arguments对象并将其放入范围对象中,并将任何参数传递给函数。任何局部变量都放入范围对象中,作为对e下一行代码被推送到执行堆栈上(这样当函数返回时,解释器知道去哪里),这个
指针被适当地设置,然后执行被转移到函数的代码中。@jfriend00是的,这或多或少就是我要寻找的。我猜这都是在本机代码后面发生的?@SHIREK-它发生在JS解释器中。这是它的工作之一(管理函数调用)是的,这是本机代码。谢谢。我想我应该更清楚地了解解释器是如何处理函数调用的,而不是让人感到困惑。因为我不知道调用了哪个函数,所以我想制造一个全局“陷阱”函数,以便我可以跟踪它的堆栈。@尖叫-我不知道您正试图解决什么问题,但也许您只是想在调试器中逐行检查代码,并确切地观察它的作用。