javascript匿名函数中的'return function()'作用


Posted in Javascript onOctober 15, 2018

我最近看到很多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') );
 }
});

评论:

我想我只是沮丧,因为它会导致人们不明白的蠕虫,更改范围界定,他们不是grokking,并通常使真正奇怪的代码.这些都是来自某些教程的地方吗?如果我们要教人们如何编写代码,我们可以教他们正确的方法吗?

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

我看到的所有使我提出这个问题的样本都是这样的问题.这是我遇到的最新的特征片段,展示了这种行为.你会注意到,我没有发布一个链接的问题,因为用户似乎是相当新手.

$(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;
    }
  });
});

请注意,我并不是说我的代码在任何方面都更好.我只是删除匿名中介功能.我实际上知道为什么这个代码最初没有做他们想要的,而且我并没有重写大家的代码,但是我确实想要这个代码至少有可用的代码.

我认为一个真正的代码示例将不胜感激.如果你真的想要这个特定问题的链接,请给我这个昵称.他得到了几个非常好的答案,其中我的中档最好.

你的第一个例子是奇怪的.我甚至不知道这是否会以作者可能打算的方式工作.第二个简单地将第一个包装在不必要的括号中.第三个使用自调用函数,尽管由于匿名函数创建了自己的范围(可能还有一个闭包),我不知道它有什么好处(除非作者在闭包中指定了其他变量 ? 读取).

自调用函数采用模式(函数f(){/ * do stuff * /}()),并且被立即评估,而不是调用它.所以这样的事情

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

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

编辑:阿尔,我误解了你的问题.没有意识到你正在呼吁不好的做法,而不是要求澄清模式.更多关于您询问的最终形式的问题:

(function () { /* woohoo */ }())
(function () { /* woohoo */ })()
function () { /* woohoo */ }()

总结

以上所述是小编给大家介绍的javascript匿名函数中的'return function()'作用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
免费空间广告万能消除代码
Sep 04 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
Nov 23 Javascript
jQuery Ajax使用实例
Apr 16 Javascript
AngularJS基础 ng-readonly 指令简单示例
Aug 02 Javascript
js图片切换具体实现代码
Oct 13 Javascript
基于Vuejs框架实现翻页组件
Jun 29 Javascript
ionic开发中点击input时键盘自动弹出
Dec 23 Javascript
微信小程序 登陆流程详细介绍
Jan 17 Javascript
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
Aug 07 Javascript
使用JS来动态操作css的几种方法
Dec 18 Javascript
Vue Cli3 创建项目的方法步骤
Oct 15 #Javascript
Vue-Router基础学习笔记(小结)
Oct 15 #Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 #Javascript
ndm:NPM的桌面GUI应用程序
Oct 15 #Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
Oct 15 #Javascript
vue+axios+promise实际开发用法详解
Oct 15 #Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 #Javascript
You might like
一个分页的论坛
2006/10/09 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python备份文件的脚本
2008/08/11 Python
自己使用总结Python程序代码片段
2015/06/02 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
Java如何格式化日期
2012/08/07 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
个人生活学习自我评价范文
2013/11/26 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
校外活动方案
2014/08/28 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
利用Apache Common将java对象池化的问题
2022/06/16 Servers
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js