注意:已更新并重写
这个问题已被重新编辑和更新。请原谅下面的过时引用。
最近我看到了很多 JavaScript 代码,但其中很多让我感觉不正确。在这种情况下,我应该建议什么更好的代码模式?我将重现我见过的代码以及每个代码块的简短描述:
代码块 #1
这段代码永远不应该评估内部函数。程序员会感到困惑,因为代码应该可以运行。
$(document).ready( function() {
return function() {
/* NOPs */
}
});
代码块 #2
程序员很可能想要实现一个自执行函数。他们没有完全完成实现(在嵌套括号的末尾缺少()
)。另外,因为他们在外部函数中没有做任何操作,所以嵌套的自执行函数可以直接内联到外部函数定义中。
事实上,我不确定他们是否打算使用自执行函数,因为代码还是错误的。但显然他们想要一个自执行函数。
$(document).ready( (function() {
return function() {
/* NOPs */
}
}));
代码块 #3
程序员似乎再次尝试使用自调用函数,然而在这种情况下这是过度设计了。
$(document).ready( function() {
(return function() {
/* NOPs */
})()
});
代码块 #4
一个示例代码块
$('#mySelector').click( function(event) {
alert( $(this).attr('id') );
return function() {
// before you run it, what's the value here?
alert( $(this).attr('id') );
}
});
注解:
我感到沮丧是因为这导致了人们不理解的“creep bugs”,改变了他们无法理解的作用域,并且通常会使代码变得非常奇怪。这一切都来自某些教程吗?如果我们要教人编写代码,能不能教他们正确的方法?
你会建议一个准确的教程来向他们解释为什么他们正在使用的代码是错误的吗?你会建议他们学习哪种模式呢?
所有引起我提出这个问题的示例都是在SO上作为问题发布的。下面是我最近发现的一个具有此行为的片段。您会注意到,我没有发布问题的链接,因为该用户似乎是一个新手。
$(document).ready(function() {
$('body').click((function(){
return function()
{
if (counter == null) {
var counter = 1;
}
if(counter == 3) {
$(this).css("background-image","url(3.jpg)");
$(this).css("background-position","10% 35%");
var counter = null;
}
if(counter == 2) {
$(this).css("background-image","url(2.jpg)");
$(this).css("background-position","10% 35%");
var counter = 3;
}
if(counter == 1) {
$(this).css("background-image","url(1.jpg)");
$(this).css("background-position","40% 35%");
var counter = 2;
}
}
})());
});
以下是我提出的重写他们代码的方法:
var counter = 1;
$(document).ready(function() {
$('body').click(function() {
if (counter == null) {
counter = 1;
}
if (counter == 3) {
$(this).css("background-image", "url(3.jpg)");
$(this).css("background-position", "10% 35%");
counter = 1;
}
if (counter == 2) {
$(this).css("background-image", "url(2.jpg)");
$(this).css("background-position", "10% 35%");
counter = 3;
}
if (counter == 1) {
$(this).css("background-image", "url(1.jpg)");
$(this).css("background-position", "40% 35%");
counter = 2;
}
});
});
请注意,我并没有说我的代码比其他任何代码更好。我只是去掉了匿名的中间函数。实际上我知道这段代码原本为什么不能实现他们想要的功能,而我也不打算重写每一个人遇到的代码,但我希望至少给这位用户提供可用的代码。我认为提供一个真正的代码示例会受到赞赏。如果你真的想要这个特定问题的链接,请用这个昵称给我发送邮件。他得到了几个非常好的答案,其中我的答案最多只能算中等水平。