javascript匿名函数中的'return function()'作用
我最近看到很多javascript代码,看起来我错了.在这种情况下,我应该建议哪种更好的代码模式?我将重现我所看到的代码和每个代码的简短说明:
代码块#1
该代码不应该评估内部函数.程序员会因为代码应该运行而感到困惑.
1 2 3 4 5 | $(document).ready( function() { return function() { /* NOPs */ } }); |
代码块#2
程序员可能打算实现一个自调用功能.他们没有完全完成实现(他们在嵌套括号的末尾缺少一个().另外,由于它们在外部函数中没有做任何事情,所以嵌套的自调用函数可以刚刚嵌入到外部功能定义.
其实我不知道他们打算使用自调用函数,因为代码仍然是错误的.但似乎他们想要一个自我调用的功能.
1 2 3 4 5 | $(document).ready( (function() { return function() { /* NOPs */ } })); |
代码块#3
再次,程序员似乎试图使用自调用函数.但是,在这种情况下,它是过度的.
1 2 3 4 5 | $(document).ready( function() { (return function() { /* NOPs */ })() }); |
代码块#4
一个示例代码块
1 2 3 4 5 6 7 8 | $('#mySelector').click( function(event) { alert( $(this).attr('id') ); return function() { // before you run it, what's the value here? alert( $(this).attr('id') ); } }); |
评论:
我想我只是沮丧,因为它会导致人们不明白的蠕虫,更改范围界定,他们不是grokking,并通常使真正奇怪的代码.这些都是来自某些教程的地方吗?如果我们要教人们如何编写代码,我们可以教他们正确的方法吗?
你会建议什么作为一个准确的教程向他们解释为什么他们使用的代码是不正确的?你会建议他们学习什么模式?
我看到的所有使我提出这个问题的样本都是这样的问题.这是我遇到的最新的特征片段,展示了这种行为.你会注意到,我没有发布一个链接的问题,因为用户似乎是相当新手.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $(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; } } })()); }); |
以下是我建议他们重写代码的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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; } }); }); |
请注意,我并不是说我的代码在任何方面都更好.我只是删除匿名中介功能.我实际上知道为什么这个代码最初没有做他们想要的,而且我并没有重写大家的代码,但是我确实想要这个代码至少有可用的代码.
我认为一个真正的代码示例将不胜感激.如果你真的想要这个特定问题的链接,请给我这个昵称.他得到了几个非常好的答案,其中我的中档最好.
你的第一个例子是奇怪的.我甚至不知道这是否会以作者可能打算的方式工作.第二个简单地将第一个包装在不必要的括号中.第三个使用自调用函数,尽管由于匿名函数创建了自己的范围(可能还有一个闭包),我不知道它有什么好处(除非作者在闭包中指定了其他变量 – 读取).
自调用函数采用模式(函数f(){/ * do stuff * /}()),并且被立即评估,而不是调用它.所以这样的事情
1 2 3 4 5 6 7 8 | var checkReady = (function () { var ready = false; return { loaded: function () { ready = true; }, test: function () { return ready; } }; }()) $(document).ready(checkReady.loaded); |
创建一个封装,将返回的对象作为checkready返回到变量ready(它从闭包之外的一切隐藏).这将允许您通过调用checkReady.test()来检查文档是否已加载(根据jQuery).这是一个非常强大的模式,并且具有很多合法用途(命名空间,记忆,元编程),但在您的示例中并不是必需的.
编辑:阿尔,我误解了你的问题.没有意识到你正在呼吁不好的做法,而不是要求澄清模式.更多关于您询问的最终形式的问题:
1 2 3 | (function () { /* woohoo */ }()) (function () { /* woohoo */ })() function () { /* woohoo */ }() |
总结
以上所述是小编给大家介绍的javascript匿名函数中的'return function()'作用,希望对大家有所帮助