为了账号安全,请及时绑定邮箱和手机立即绑定

初始化之前如何访问 timeoutID?

初始化之前如何访问 timeoutID?

慕的地10843 2023-08-24 15:55:51
function addNew() {    let id = setTimeout( function() {console.log(id)}, 0)}addNew()初始化之前如何访问 id?我认为这与第二个代码片段没有什么不同。function customTimeout(fn) {    fn()    return 32423}function addNew() {    let id = customTimeout( function() {console.log(id)})}addNew()
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

尚未初始化的变量不能直接被运行到变量初始化之前的行(该行)直接引用let id =,但仍然允许尚未调用的函数引用内部变量。


在第一个代码片段中,setTimeout回调不会运行,直到该let id =行完成id变量的初始化,因此这是允许的。


在第二个片段中,传递给的回调在in 行完成初始化之前customTimeout运行,因此不允许这样做。let id =addNewid


// Permitted:


const fn = () => {

  // do something with someVariable

  console.log(someVariable);

};

// The above is fine

let someVariable = 'foo';

// just make sure fn is called ONLY AFTER `let someVariable;` runs

fn();


// Not permitted:


const fn = () => {

  console.log(someVariable);

};

fn();

let someVariable = 'foo';


// Permitted, since fn is called asynchronously:


function customTimeout(fn) {

    Promise.resolve().then(fn);

    return 32423

}


function addNew() {

    let id = customTimeout( function() {console.log(id)})

}


addNew()


// Permitted, since fn is called asynchronously:


function customTimeout(fn) {

    setTimeout(fn);

    return 32423

}


function addNew() {

    let id = customTimeout( function() {console.log(id)})

}


addNew()


// Permitted, since fn is called after `id` has finished being assigned to:


function customTimeout(fn) {

    return [12345, fn];

}


function addNew() {

    let [id, fn] = customTimeout( function() {console.log(id)})

    fn();

}


addNew()


查看完整回答
反对 回复 2023-08-24
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

当您调用时setTimeout(即使超时0),回调不会立即运行。它被放入堆栈中以便在将来的某个时刻运行。

因此,在第一个示例中,您将设置id为 . 返回的“timeoutID” setTimeout当将来(异步)运行回调时,id是否存在并且回调可以看到它。

在第二个示例中,您将回调传递给customTimeout. 在该函数返回任何内容之前,会运行回调。它立即(同步)运行,并在回调运行后customTimeout返回一个值。

由于该值是在函数运行返回的,因此函数看不到它。


查看完整回答
反对 回复 2023-08-24
?
catspeake

TA贡献1111条经验 获得超0个赞

看例子,希望你能理解。


function addNew() {

    let id = setTimeout(  // <-- 1

                function() { // <-- 2

                    console.log(id) // <--- here

                            }

                      , 0)

}


addNew()





/*

* It will not work.

*/

function addOld() {

    console.log(id)

    let id = 2;

}

addOld()


查看完整回答
反对 回复 2023-08-24
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信