1

如何在现有功能之上添加功能?

我正在使用以下方式,它给了我错误resources.onload

    resource = document.getElementById(this.id);

    if (resource && resource.getAttribute('data-loading'))
    {           
        onloadOthers = resource.onload;
        onloadThis   = this.onComplete.bind(this);

//following line give error

        resource.onload = function () { // callback loops again and again!!!!!!
            if (typeof onloadOthers == "function")
                onloadOthers();
            onloadThis();
        };

        return; // just added another callback, no need to add it again.
    }
    else if (resource)
    {           
        this.onComplete();
        return; // already exist
    }

    if (this.type == "js")
    { //if filename is a external JavaScript file
        var code = document.createElement('script');
        code.setAttribute("type", "text/javascript");
        code.setAttribute('data-loading', 'yes');
        code.setAttribute("src", this.file);
        code.onload = this.onComplete.bind(this);
        code.onreadystatechange = code.onload; // ie fix
    }
4

1 回答 1

1

通过为关键字添加前缀,将onloadOthersandresources变量移动到新的闭包中。var

目前,您的代码“回收”这些(全局)变量,因为它们是在非本地范围内声明的:

var onloadOthers;
function func() {
    onloadOthers = ...;
    resource.onload = function() {
        onloadOthers(); // Calls the global `onloadOthers` function.
    };
}
func(); // Defines `onloadOthers`
func(); // Overwrites `onloadOthers`

通过将变量移动到本地范围,函数的所有实例都将拥有一个“自己的”onloadOthers变量,从而解决了问题。

如果您想了解有关此主题的更多信息,请阅读JavaScript 闭包如何工作?.

于 2013-05-17T12:10:53.933 回答