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