Javascript jQuery中匿名函数的去匿名化
这可能是一个很简单的问题,但它会让我抓伤我的头,所以我把它贴在这里 我有以下形式的jQuery:Javascript jQuery中匿名函数的去匿名化,javascript,jquery,Javascript,Jquery,这可能是一个很简单的问题,但它会让我抓伤我的头,所以我把它贴在这里 我有以下形式的jQuery: if (jQuery('.SearchRegions:checked').length == 0) { jQuery('.SearchRegions').each(function(){ //code }); } else { jQuery('.SearchRegions:checked').each(function(){ //the same
if (jQuery('.SearchRegions:checked').length == 0) {
jQuery('.SearchRegions').each(function(){
//code
});
} else {
jQuery('.SearchRegions:checked').each(function(){
//the same code
});
}
显然,在每个函数中重复一大块代码似乎很荒谬。但是当我尝试命名和移动函数时,它似乎都崩溃了——可能是因为函数中的作用域和/或jQuery(这个)不再引用同一个对象
有谁能帮我发布一个关于我的代码应该是什么样子的一般想法吗?(或任何其他优化或重新设置以使其工作将不胜感激!)您完全可以定义一个函数并按名称使用它:
function someHandler(event) {
// code code code
}
jQuery('.SearchRegions').each(someHandler);
请注意,当您按名称引用函数时,不包含“()”您可以定义函数并按名称使用它:
function someHandler(event) {
// code code code
}
jQuery('.SearchRegions').each(someHandler);
请注意,当您按名称引用函数时,不包含“()”假设闭包确实是问题所在,您可以参数化“匿名”函数以将这些值传递给它。例如:
function eachRegion(values, $container, foo) {
// common code which uses scope variables `values`, `$container`, and `foo`
}
// elsewhere, in code defining `values`, `$container`, and `foo`...
if (jQuery('.SearchRegions:checked').length == 0) {
jQuery('.SearchRegions').each(function(){
eachRegion(values, $container, foo);
});
} else {
jQuery('.SearchRegions:checked').each(function(){
eachRegion(values, $container, foo);
});
}
假设闭包确实是问题所在,您可以参数化“匿名”函数以将这些值传递给它。例如:
function eachRegion(values, $container, foo) {
// common code which uses scope variables `values`, `$container`, and `foo`
}
// elsewhere, in code defining `values`, `$container`, and `foo`...
if (jQuery('.SearchRegions:checked').length == 0) {
jQuery('.SearchRegions').each(function(){
eachRegion(values, $container, foo);
});
} else {
jQuery('.SearchRegions:checked').each(function(){
eachRegion(values, $container, foo);
});
}
您可以将函数定义为变量,并在每个方法调用中使用它
var yourEachFunction = function(){$("ul").append("<li>" + $(this).val() + "</li>");}
if (jQuery('.SearchRegions:checked').length == 0) {
jQuery('.SearchRegions').each(yourEachFunction );
} else {
jQuery('.SearchRegions:checked').each(yourEachFunction );
}
var yourEachFunction=function(){$(“ul”).append(“”+$(this.val()+” ”);}
if(jQuery('.SearchRegions:checked')。长度==0){
jQuery('.SearchRegions')。每个(yourEachFunction);
}否则{
jQuery('.SearchRegions:checked')。每个(yourEachFunction);
}
此操作的示例。您可以将函数定义为变量,并在每个方法调用中使用它
var yourEachFunction = function(){$("ul").append("<li>" + $(this).val() + "</li>");}
if (jQuery('.SearchRegions:checked').length == 0) {
jQuery('.SearchRegions').each(yourEachFunction );
} else {
jQuery('.SearchRegions:checked').each(yourEachFunction );
}
var yourEachFunction=function(){$(“ul”).append(“”+$(this.val()+” ”);}
if(jQuery('.SearchRegions:checked')。长度==0){
jQuery('.SearchRegions')。每个(yourEachFunction);
}否则{
jQuery('.SearchRegions:checked')。每个(yourEachFunction);
}
此操作的示例。您可以让公共函数接受
此
部分作为参数。我可以用示例代码将其扩展为一个答案,如果您喜欢一个不相关的注释,那么您的代码当前会扫描DOM三次。您可以通过“缓存”jQuery对象来提高其速度:var$regions=$(“.SearchRegions”),$checked=$regions.filter(“:checked”);如果(!$checked.length){$regions.each(…);}其他{$checked.each(…);}
这两条评论都是好的和有用的观点-我有一些“啊哈,现在我看到了”的理解闪现@Ben:“缓存”这样的jQuery对象是否会带来丢失对象不断变化的值的风险?e、 g.如果我创建一个名为$input的变量来缓存'jQuery('#input')。如果($inputfield.val!=0)以后可以使用吗?我不想愉快地将我所有的DOM元素分配给变量,然后发现我破坏了一切。(在给出的代码示例中,您的建议似乎没有任何可能的缺点,当然…)-当DOM更改时,jQuery对象不会得到“更新”,这意味着如果您有一个被删除的节点引用,它仍然会指向孤立节点。类似地,如果为$li=$(“li”)
创建一个变量,然后将新段落添加到DOM中,则原始$li
将不会拾取它们()。但是,总的来说,它们是完全安全的。:-)您可以让公共函数接受此
部分作为参数。我可以用示例代码将其扩展为一个答案,如果您喜欢一个不相关的注释,那么您的代码当前会扫描DOM三次。您可以通过“缓存”jQuery对象来提高其速度:var$regions=$(“.SearchRegions”),$checked=$regions.filter(“:checked”);如果(!$checked.length){$regions.each(…);}其他{$checked.each(…);}
这两条评论都是好的和有用的观点-我有一些“啊哈,现在我看到了”的理解闪现@Ben:“缓存”这样的jQuery对象是否会带来丢失对象不断变化的值的风险?e、 g.如果我创建一个名为$input的变量来缓存'jQuery('#input')。如果($inputfield.val!=0)以后可以使用吗?我不想愉快地将我所有的DOM元素分配给变量,然后发现我破坏了一切。(在给出的代码示例中,您的建议似乎没有任何可能的缺点,当然…)-当DOM更改时,jQuery对象不会得到“更新”,这意味着如果您有一个被删除的节点引用,它仍然会指向孤立节点。类似地,如果为$li=$(“li”)
创建一个变量,然后将新段落添加到DOM中,则原始$li
将不会拾取它们()。但是,总的来说,它们是完全安全的。:-)嗯,你当然完全正确。我想知道我最初的困难是从哪里来的?可能是一些至少和在函数调用末尾添加()一样愚蠢的事情。。。非常感谢。嗯,你当然完全正确。我想知道我最初的困难是从哪里来的?可能是一些至少和在函数调用末尾添加()一样愚蠢的事情。。。非常感谢。谢谢另一个很好的建议,对jQuery的工作方式有启发,或者可以使其工作。谢谢!另一个很好的建议,对jQuery如何工作或如何使其工作有启发。