首页 > 关于《javascript语言精粹》中P38闭包:改变Body颜色的例子没有在浏览器生效

关于《javascript语言精粹》中P38闭包:改变Body颜色的例子没有在浏览器生效

var fade = function(node) {
    var level = 1;
    var step = function () {
        var hex = level.toString(16);
        node.style.backgroundColor = '#FFF' + hex + hex;
        if (level < 15) {
            level += 1;
            setTimeout(step, 100);
        }
    }
    setTimeout(step, 100);
};
fade(document.body);

1、 怎么理解 内部函数拥有比它的外部函数更长的生命周期 这句话
2、 在这个函数中的两次setTimeout();第一次的setTimeout是用来持续执行的。那么第二次的setTimeouts仅仅只是为了在0.1秒后调用step的吗?难道不可以直接调用step()嘛?
3、 为什么浏览器中Body颜色没有变换?我试着换了别的元素,把bacgroundColor换成bacgroundcolor,或者用jquery,发现都不想。但是console.log()还是能打印出颜色变化的。这是为森马?


1、 说一下上下文吧。。。没看过这本书,感觉这么说不太合适。
2、是的,也可以直接调用 step,但是是立即开始执行第一次step,上述代码是 100ms 之后执行第一次 step
3、是因为写错了。。。颜色要 三位或六位
node.style.backgroundColor = '#FFF' + hex + hex + hex;


内部函数比外部函数生命周期长是不是说的是内部函数式声明式函数并且外部能够调用或延迟调用的情况?

function outer(){
    // ...
    function inner(){
    }
    // ...
    return {
        inner : inner
    }
}

上面这种情况,在outer函数生命周期内(函数体部分)inner函数都是可以访问的,并且outer函数的调用者还能调用inner函数,而这时outer函数的生命周期已经结束了。

function outer(){
    // ...
    function inner(){
    }
    // ...
    setTimeout(inner,1000);
}

上面这种情况类似你例子中说的,setTimeout是个异步函数,到setTimeout的时候不会等待inner的执行outer的生命周期就已经结束了,而1s后inner函数还可以执行。

【热门文章】
【热门文章】