簡體   English   中英

Javascript-閉包和普通函數之間的區別

[英]Javascript - difference between closure and normal function

我是Java語言的新手,我一直在看一段視頻,在該視頻中,我使用下面的閉包找到了對衰落函數的引用(已修改為包括更少的代碼)。

 function fade(id) {
            var dom = id, level = 1;
            console.log(dom + ' : ' + level);
            function step() {
                var h = level.toString(16);
                dom = dom + h;
                if (level < 5) {
                    console.log('level '+ id + ' = '+level);
                    level +=1;
                    setTimeout(step,100);
                }
            }; setTimeout(step,100);
};

當我多次調用此函數時,請說fade(1); fade(2); fade(3); 在瀏覽器控制台中,我看到執行是並行的,即所有三個函數調用正在同時執行。 由於控制台中的日志語句,我認為它是並行的。

然后我將step聲明為淡入淡出功能范圍之外的函數,並從淡入淡出調用此函數:

function step(dom, level) {
    var h = level.toString(16);
    dom = dom + h;
    if (level < 5) {
        console.log('level '+ dom + ' = '+level);
        level +=1;
        setTimeout(step(dom,level),100);
    }
};

function fade(id) {
    var dom = id, level = 1;
    console.log(dom + ' : ' + level);
    setTimeout(step(dom,level),100);
};

當我這樣調用淡入淡出時:fade(1); fade(2); fade(3); 執行幾乎像是順序執行,即首先執行fade(1),然后依次執行其他操作。

出現這種現象的原因是什么,是否是由於閉包引起的,如果可以的話,請您解釋一下當我將閉包引入頂層函數時發生了什么變化嗎? 任何有關此的幫助,主題/概念的尋找將不勝感激。

您要告訴step函數執行,而不是將其作為“非關閉”代碼中的引用傳遞。 嘗試更改step()step setTimeout()調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM