为什么调用带有括号的setTimeout不会启动一个新的调用栈
Why does calling setTimeout with parenthesis not start a new callstack?
当调试器在d(此处为jsfiddle)中启动时,以下代码有一个新的调用堆栈
function c() {
setTimeout( d, 1000 );
}
function d() {
debugger;
}
c();
如果我们将代码修改为使用带有括号(括号:)的setTimeout( d(), 1000 );
function c() {
setTimeout( d(), 1000 );
}
function d() {
debugger;
}
c();
则调用堆栈同时具有c()和d()(此处为jsend)。为什么?
您没有将第二个示例中的d
函数传递给setTimeout
;您正在传递d()
,这是调用d
的结果。
调用d
的结果是undefined
,因为它没有返回任何东西,它转换为字符串"undefined"
,然后是eval
ed,做…正是。
关于调用堆栈,因为你在c
内部调用d
,这就是为什么你在调用堆栈中看到c
。为了澄清,第二个示例与
function c() {
var temp = d();
setTimeout(temp, 1000);
}
function d() {
debugger;
}
c();
SetTimeout接受一个函数参数。如果你传递一个字符串,它的行为就像eval。如果您像之前那样调用该函数,它会立即触发,然后setTimeout会在新的调用堆栈中触发结果。
因为在第一个例子中,你传递了一个函数指针作为在1秒内执行的东西。在第二个示例中,您已经执行了d,并且将d()的结果传递给setTimeout,以便在1秒内调用。
相关文章:
- 代码背后调用一个JavaScript函数的按钮点击-C#
- 在Javascript中对类的每个实例调用一个方法
- 调用一个“;默认瓦片”;在谷歌地图中
- 使用几个<脚本>标签不会't工作-只调用一个脚本
- NodeJS-从同一文件中的另一个方法调用一个方法
- 从我自己的脚本中包含的Javascript文件中调用一个函数
- 你能调用一个在调用者上下文中返回的函数吗
- 我需要在每5秒内调用一个函数,并重置持续时间
- 触发事件以调用一个函数'它在一个封闭的里面
- 每次数据表中的页面更改时调用一个函数
- 在带有参数列表的表单submit上调用一个方法
- 调用一个函数两次
- 我想在 javascript 中调用一个 php 函数,并在其中传递两个数组作为参数
- 从面板中调用一个在 ExtJs 中没有事件的方法
- 如何调用一个函数,其名称是通过在node.js中组合一些变量来动态创建的
- 动态弹出窗口'通过调用一个永远运行并返回's每个周期后的数据
- 通过javascript调用一个C#windows服务函数
- 从html中调用一个c++函数
- 你能用onblur事件调用一个外部Javascript吗
- 从javascript中调用一个c#函数