Javascript “对MDN的澄清”;使用函数而不是计算代码片段";-为什么';那是什么?

Javascript “对MDN的澄清”;使用函数而不是计算代码片段";-为什么';那是什么?,javascript,asynchronous,promise,settimeout,eval,Javascript,Asynchronous,Promise,Settimeout,Eval,在MDN关于eval的文章中,有一段标题为,在示例代码中有一个关于setTimeout()的参考。我不明白为什么会有这样的建议/命令,所以,保留setTimeout()引用,有人能告诉我为什么这些代码会按预期工作: function timedPromise(){ return new Promise((resolve) => { setTimeout(( ) => {resolve(console.log('Promise resolved!'))}, 1000)

在MDN关于
eval
的文章中,有一段标题为,在示例代码中有一个关于setTimeout()的参考。我不明白为什么会有这样的建议/命令,所以,保留setTimeout()引用,有人能告诉我为什么这些代码会按预期工作:

function timedPromise(){
  return new Promise((resolve) => {
    setTimeout(( ) => {resolve(console.log('Promise resolved!'))}, 1000)
  })
};
 
function timedPromise2(){
  return new Promise((resolve) => {
    setTimeout(function(){resolve(console.log('Another promise resolved!'))}, 2000)
  })
};
timedPromise();
timedPromise2();
/*output:
Promise {<pending>}
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined
Promise resolved! //after at least 1s
Another promise resolved! //after at least 2s
*/
函数timedPromise(){
返回新承诺((解决)=>{
setTimeout(()=>{resolve(console.log('Promise resolved!'))},1000)
})
};
函数timedPromise2(){
返回新承诺((解决)=>{
setTimeout(function(){resolve(console.log('other promise resolved!'))},2000)
})
};
timedPromise();
timedPromise2();
/*输出:
承诺{}
[[PromiseState]]:“已履行”
[[PromiserResult]]:未定义
承诺解决//至少1秒后
又一个承诺解决了//至少2秒后
*/
而这个代码不会

function timedPromise(){
  return new Promise((resolve) => {
    setTimeout(resolve(console.log('I resolved!')), 1000)
  })
};
 
timedPromise();
/*output:
I resolved! //immediate
Promise {<fulfilled>: undefined}
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined
*/
函数timedPromise(){
返回新承诺((解决)=>{
setTimeout(解析(console.log('I resolved!')),1000)
})
};
timedPromise();
/*输出:
我下定决心了//立即的
承诺{:未定义}
[[PromiseState]]:“已履行”
[[PromiserResult]]:未定义
*/
据我所知,浏览器将代码段作为
字符串而不是函数进行计算,然后对其进行解释并立即执行,而不是等待setTimeout()的延迟传递

为什么呢


为什么/何时应该使用包装函数而不是代码段作为参数?它是否只与异步性相关?

当您编写
functionName()
时,
()
会立即调用该函数

因此,当您编写
setTimeout(resolve(console.log('I resolved!'))时,1000)
it:

  • 首先调用
    console.log
    ,将其返回值传递到
    resolve
  • 调用
    resolve
    将其值传递到
    setTimeout
  • 调用
    setTimeout

在lambda中封装函数时,传递对该函数的引用,而不是立即调用它。这样看可能更清楚:

function doLog(){console.log(“你好,世界!”);}
//立即调用doLog,传入未定义的返回值
setTimeout(doLog(),1000);
//传入对doLog的引用,setTimeout稍后将调用该引用
设置超时(doLog,1000);

基本上是:“延迟评估”或“延迟评估”。Javascript引擎必须计算当前的代码。如果此代码有副作用(如在控制台上打印),则会立即执行此操作。但是您希望稍后触发一些东西,比如“哦,我的函数的这个参数`是一些稍后执行的代码,当函数认为合适时,而不是现在!”然后模式将使用包装函数。这在大多数编程语言中都是等效的。诀窍是,javascript可以立即将代码作为“调用时将执行某些操作的另一个函数”进行计算。所以你知道包装函数中的内部代码不会立即执行。谢谢Pac0,我喜欢“包装它,如果你想推迟它”的想法,好的,谢谢。所以“使用函数而不是计算代码片段”只是与这样一个事实有关,即在这种情况下,代码片段是立即计算的,而不是延迟计算的?