当javascript运行时找到setTimeout()方法时,它将其发送到事件表.运行时如何知道setTimeout()是一个Web API?它是否首先在当前上下文中查找setTimeout()方法,如果未找到,则将其假定为Web API?

推荐答案

当javascript运行时找到setTimeout()方法时,它将其发送到事件表.

JavaScript并不"知道"或关心setTimeout做了什么.:-)只是setTimeout是在主机环境中定义的函数之一,由主机(在您的示例中是浏览器)提供给JavaScript引擎.当您使用JavaScript调用函数时,函数的实现(由宿主环境提供)将使用您提供的信息来执行.知道如何处理您提供给setTimeout的参数的是宿主,而不是JavaScript引擎.

当主机(浏览器或Node.js或其他任何东西)需要创建新的运行时环境(例如,用于窗口)时,它所做的一件事是创建一个对象,作为该环境(更恰当地称为realm)的主机提供的全局对象,包括将提供主机定义的特性的任何属性(如setTimeout)放在该对象上.它通过JavaScript规范所称的InitializeHostDefinedRealm抽象操作将该对象提供给JavaScript引擎.当JavaScript引擎运行使用setTimeout的代码时,它会看到标识符setTimeout,并查看当前执行上下文中是否定义了setTimeout;如果没有定义,引擎就会查看父执行上下文,依此类推,直到到达全局执行上下文,后者从宿主提供的全局环境中获取全局变量(部分地;它还有其他全局变量).因此,在找到与setTimeout匹配的函数后,JavaScript引擎调用该函数,该函数运行主机定义的函数代码,该代码设置计时器.

因此,JavaScript引擎不知道setTimeout does是多少,只知道它从宿主获得的全局对象上有一个setTimeout函数.

Javascript相关问答推荐

Angular:动画不启动

我可以从React中的出口从主布局调用一个处理程序函数吗?

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

使用Promise.All并发解决时,每个promise 的线性时间增加?

PDF工具包阿拉伯字体的反转数字

JS:XML insertBefore插入元素

如何在使用rhandsontable生成表时扩展数字输入验证?

使用VUE和SCSS的数字滚动动画(&;内容生成)

如何在Node.js中排除导出的JS文件

如何将zoom 变换应用到我的d3力有向图?

AJAX POST在控制器中返回空(ASP.NET MVC)

Jexl to LowerCase()和Replace()

如何在尚未创建的鼠标悬停事件上访问和着色div?

用Reaction-RT-Chart创建实时条形图

ComponentWillReceiveProps仍在React 18.2.0中工作

AstroJS混合模式服务器终结点返回404

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行

与find()方法一起使用时,Mongoose中的$or运算符没有提供所有必需的数据

我如何让我的弹力球在JavaScript和HTML画布中相互碰撞后改变 colored颜色 ?