我正在研究这个小的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/