我正在研究这个小的javascript库,并遵循各种建议,出于各种原因(将变量封装,隐藏代码等),我将功能包装在了一个闭包中。由于我查询JSON网络服务并显示结果,因此我也使用了jquery tmpl引擎。
我想我了解闭包有什么好处,但我一般不会理解它们。这意味着我在所有这些范围更改与其他更改之间完全迷失了。特别烦人的是我得到的这个异常。考虑以下代码(所讨论代码的简化的丑陋版本,但它重现了问题)

// something would be the object that handles all the library functionality
var something = function(){

    // creating a local function that goes as a parameter into the Array.filter
    function isBar(data){
        return data.name === "bar";
    }

    // the template code
    var bla = "<h1>${name}<\h1><h2>${attribute.filter(isBar)[0].value}</h2>";

    // precompiling the the template
    $.template("test", bla);

    // and returning a function that should render the template with the provided data
    return {
        funny: function(){
            $.tmpl("test", [{"name":"Fo", "attribute":[{"name":"bar", "value":"how"}]},
                            {"name":"Foo", "attribute":[{"name":"fnord","value":"can"}]},
                            {"name":"Fooo", "attribute":[{"name":"bar","value":"this"}]},
                            {"name":"Foooo", "attribute":[{"name":"Bar", "value":"be"}]}
            ]);
        }
    }
}();
// calling the function
something.funny();


因此,在调用something.funny()时,我会期望发生以下情况:作为闭包的函数funny在其原始上下文中被调用(例如,定义了函数isBar和变量bar)。因此,当我调用$.tmpl时,我希望模板中的attribute.filter(isBar)也在此范围内。但事实并非如此。我的Chrome浏览器得到ReferenceError: isBar is not defined
如果有人愿意向我展示我的错误方式,我将非常高兴。

最佳答案

编辑糟糕,我错过了“()”。

好吧,问题在于闭包中对局部变量的引用实际上并不是对局部变量的引用-它们是字符串的一部分。模板代码必须解析该字符串,因此,在关闭时从调用“ $ .tmpl()”的闭包中有一个名为“ isBar()”的事实真的没有关系; jQuery无法访问它们,因为您无法在JavaScript中进行访问。

但是,您可以将“ options”第三个参数传递给“ $ .tmpl()”,并在那里提供其他内容。我不是100%知道如何做,因为我只玩过模板插件,但是如果有机会,我会尝试jsfiddle。我认为您基本上会执行以下操作:

    funny: function(){
        $.tmpl("test", [{"name":"Fo", "attribute":[{"name":"bar", "value":"how"}]},
                        {"name":"Foo", "attribute":[{"name":"fnord","value":"can"}]},
                        {"name":"Fooo", "attribute":[{"name":"bar","value":"this"}]},
                        {"name":"Foooo", "attribute":[{"name":"Bar", "value":"be"}]}
        ], { isBar: isBar });
    }


我不确定的是您是在模板文本中将其称为“ $ {isBar()}”还是“ $ {item.isBar()}”。

关于javascript - jQuery tmpl在关闭中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6508950/

10-12 06:51