Javascript - 闭包和普通函数之间的区别

时间:2016-02-24 19:51:48

标签: javascript

我是Javascript的新手,我一直在浏览一个视频,其中我使用下面的闭包找到了对淡入淡出函数的引用(修改为包含更少的代码)。

 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);
};

当我多次调用此函数时,淡入淡出(1);淡入淡出(2);淡入淡出(3);在浏览器控制台中,我看到执行是并行的,即所有三个函数调用都在同时执行。由于控制台中的日志语句,我认为它是并行的。

然后我将步骤声明为淡入淡出函数范围之外的函数,并从淡入淡出调用此函数:

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);
};

当我这样称为淡入淡出时:淡化(1);淡化(2);淡化(3);执行几乎看似顺序,即淡入淡出(1)先执行,然后按顺序执行。

这种行为的原因是什么,是因为关闭,如果是这样,请你解释一下当我将闭包引入顶层函数时会发生什么变化?任何关于这个,帮助的主题/概念的帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

您告诉step函数执行而不是将其作为'非闭包'代码中的引用传递。尝试在step()来电

中将step更改为setTimeout()