首先,我们先看看下面几种写法:
1.function f(x){return x*x;};f(x);
2.(function(x){return x*x;})(x);
3.(function(x){return x*x;}(x));

第一种我们应该都很熟悉了,这是我们经常使用的写法。第二第三种都是匿名函数的写法。
--------------------------------------------------------------------------------
第二种
可以这样理解:
var f=function(x) {return x*x;};f()
那我们不通过f这个变量来引用函数就是
function(){}()
然而这样肯定是错误的就像
var f=1+2; f=f*0;

var f=1+2*0;

结果不同一样。
要得到正确结果只能:
f=(1+2)*0;
也就是要明确的标识出程序块,即:
(function(){})()

肯你有疑问:括号"()"到底是不是起到了标识代码块的作用?
我们可以用JavaScript的内置函数检测一下!
举一个最简单的例子:
alert(4)
这段代码会弹出提示内容是“4”
改成这样
(alert)(4)
可以看到执行的效果和上一段代码一样。
这种形式的函数执行也被很多JavaScript框架所采用。
--------------------------------------------------------------------------------
第三种,如果你用过jsvm框架的话就会发现里面的代码使用了这种形式。
那如何解释第三种情况呢?
为了弄明白浏览器是如何理解这样的写法的,我们可以利用一下Mozilla Firefox的错误控制台功能。
在代码中插入一段错误代码,代码段如下:
(function(s){s+s}(1)).splice();
打开Mozilla Firefox的错误控制台,可以看到有如下的错误提示
错误: (function (s) {})(1) has no properties
行:18
可以认为,浏览器对于
(function(s){s+s}(1))
这样的代码按照
(function (s) {s+s})(1)
来解析的。

--------------------------------------------------------------------------------
到此可能你有这样的认识:
function f(x){return x*x;};f(x);==(function(x){return x*x;})(x);==(function(x){return x*x;}(x));

但是他们还是有区别的,
首先,对于像第二和第三种形式,其它的函数和代码是不可能调用所定义的函数的,有一种说发把这样的函数称为匿名函数或者函数直接量。
其次,第二和第三种形式执行的函数,中间变量不会污染到全局命名空间,你可以把中间的代码看作纯粹的子过程调用。
当然使用后面两种形式的函数定义可以很容易的实现闭包。

最新文章

  1. js中查找相同的几种函数
  2. espcms内容页上下篇按后台手动排序号
  3. ubuntu同时安装qt4.8和qt5.7
  4. 在某公司时的java开发环境配置文档
  5. CAN Timing Sample Point
  6. 利用zabbix监控某个目录大小
  7. Java - HttpURLConnection
  8. ArcGIS 读写lyr层文件
  9. 自动加载类PHP中spl_autoload_register函数的用法
  10. Programming C#.Classes and Objects.传递参数
  11. Windows系统架构
  12. Windows下编译SDL
  13. cocos2d-js(一)引擎的工作原理和文件的调用顺序
  14. codeforces gym #102082C Emergency Evacuation(贪心Orz)
  15. 24 GISer必备知识(一) 坐标系
  16. man termios(FreeBSD 12.0)
  17. 前后端分离之JWT用户认证(转)
  18. java中String new和直接赋值的区别
  19. javaScript一些需要注意的细节
  20. caffe fine tune 复制预训练model的参数和freeze指定层参数

热门文章

  1. 【bzoj4448】SCOI2015 情报传递
  2. Bzoj-2301 [HAOI2011]Problem b 容斥原理,Mobius反演,分块
  3. C# 网络编程小计 20150202
  4. [ Python ] 基本数据类型及属性(下篇)
  5. elasticsearch批量删除(查询删除)
  6. LeetCode解题报告—— Word Search & Subsets II & Decode Ways
  7. 部署Nginx
  8. hdu 1430(BFS+康托展开+映射+输出路径)
  9. 确实,k8s的时代,ingress负载用traefik比nginx方便啊
  10. bzoj 1559 AC自动机 + dp