草庐IT

javascript - 现在 javascript 匿名函数中的 `return function()` 是怎么回事? (最佳实践)

coder 2024-05-06 原文

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




注意:更新和重写

这个问题已经重做和更新。请原谅以下过时的引用资料。
谢谢。

我最近看到了很多对我来说看起来不对的 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') );
  }
});

评论:

我想我只是很沮丧,因为它会导致人们不理解的蠕变错误,改变他们不了解的范围,并且通常会产生非常奇怪的代码。这一切都来自某处的一些教程吗?如果我们要教人们如何编写代码,我们能以正确的方式教他们吗?

您会建议什么作为准确的教程来向他们解释为什么他们使用的代码不正确?你会建议他们学习什么模式?

我看到的所有让我提出这个问题的样本都被作为问题提出来了。这是我遇到的展示这种行为的最新特定片段。您会注意到我没有发布问题的链接,因为用户似乎是新手。
$(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;
        }
    });
});

请注意,我实际上并不是说我的代码在任何方面都更好。我只是删除匿名中介功能。我实际上知道为什么这段代码最初并没有按照他们的意愿行事,而且我不从事重写每个人的代码的业务,但我确实希望小伙子至少有可用的代码。

我认为真正的代码示例将不胜感激。如果你真的想要这个特定问题的链接,请在这个昵称给我发邮件。他得到了几个非常好的答案,其中我的答案充其量是中等水平。

最佳答案

你的第一个例子很奇怪。我什至不确定这是否会按照作者可能想要的方式工作。第二个只是将第一个包裹在不必要的括号中。第三个使用自调用函数,尽管由于匿名函数无论如何都会创建自己的范围(可能还有闭包),我不确定它有什么好处(除非作者在闭包中指定了其他变量 - 请继续阅读)。

自调用函数采用模式 (function f () { /* do stuff */ }())并立即进行评估,而不是在调用时进行评估。所以是这样的:

var checkReady = (function () {
    var ready = false;
    return {
        loaded: function () { ready = true; },
        test: function () { return ready; }
    };
}())
$(document).ready(checkReady.loaded);

创建一个闭包绑定(bind)对象返回为checkready到变量 ready (这对封闭之外的一切都是隐藏的)。然后,这将允许您通过调用 checkReady.test() 检查文档是否已加载(根据 jQuery)。 .这是一个非常强大的模式,并且有很多合法用途(命名空间、记忆化、元编程),但在您的示例中并不是必需的。

编辑:啊,我误解了你的问题。没有意识到您是在呼吁不良做法,而不是要求澄清模式。在您询问的最终表格中更重要的是:
(function () { /* woohoo */ }())
(function () { /* woohoo */ })()
function () { /* woohoo */ }()

评估大致相同的东西 - 但第一种形式最不可能产生任何意想不到的后果。

关于javascript - 现在 javascript 匿名函数中的 `return function()` 是怎么回事? (最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3945259/

有关javascript - 现在 javascript 匿名函数中的 `return function()` 是怎么回事? (最佳实践)的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  4. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  5. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  6. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  8. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  9. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  10. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

随机推荐