定义对象的替代方法?对象字面量可以工作,但有冗余



好了,我给自己做了一个小对象,用一个回退的东西来评估整个加载jquery(并使用它来加载我所有的js文件,事实上),使用JSON:

<script type="text/javascript">
/* Library loading object */
var ScriptLoader = {
    //values
    head_tag : document.getElementsByTagName('head')[0],
    fallback : false,
    //functions
    createScript: function(script_path) {
        var script_tag = document.createElement('script');
        script_tag.type = 'text/javascript';
        script_tag.src = script_path;
        return script_tag;
    },
    addToHead : function(tag) {
        ScriptLoader.head_tag.appendChild(tag);
    },
    addLoadEvent : function(func) {
        var prev = window.onload;
        if (typeof window.onload !== 'function') {
            window.onload = func;
        } else {
            window.onload = function() {
                prev();
                func();
            }
        }
    }
};

//Loading jquery, modernizr, and my js files when window is ready.
ScriptLoader.addLoadEvent(function() {
    /* Load from jquery's cdn for speed + auto latest download */
    var scripts = ['http://code.jquery.com/jquery-latest.min.js',
        'scripts/modernizr.js',
        'scripts/script.js'],
            idx = 0;
    for (; idx < scripts.length; idx++) {
        ScriptLoader.addToHead(ScriptLoader.createScript(scripts[idx]));
    }
});
//jquery fallback
ScriptLoader.addLoadEvent(function() {
    if (typeof window.jQuery === undefined) {
        ScriptLoader.fallback = true;
        ScriptLoader.addToHead(ScriptLoader.createScript('scripts/jquery-mini-1.6.2.js'));
    }
});
//grab info
(function() {
    setTimeout(function() {
        console.log('jquery loaded: ' + (window.jQuery !== undefined));
        console.log('used fallback: ' + ScriptLoader.fallback);
    }, 1000);
})();

现在,这是完全工作的,但注意到常数调用我的对象的名称吗?有没有一种方法可以简单地使用this而不是那个?我得到了整个函数级作用域的东西,也意识到这被分配给最近的封闭函数,但我不是很清楚…

我也简要地读了一下,但不完全理解闭包。

谢谢:)

不,因为this指向对象的实例,而不是对象模板。

闭包只是从函数内部返回的函数,然后可以将其赋值给新变量并像父函数一样执行。闭包保留其原始父函数的作用域,即使它的新赋值中没有提到它。这就是闭包容易发生内存泄漏的原因,因为ECMAScript的垃圾收集器没有闭包赋值的作用域。

function foo(a,b){
  var c = 1;
  return function(c){
    return a + b + c;
  }
}
var bar = foo(3,5); // bar is now a closure
alert(bar(2)); // 10

最新更新