惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - zfh424

Ext自定义类 Extjs3.0 Javascript小助手 DOM标准定位 HTML 对象的定位. EXTJS2.2 FormPane对象研究 EXTJS-Grid HTML事件集合 DOM属性,函数 使用企业库调用存储过程,并接受return 的返回值 Windwos服务的安装卸载 枚举 C#类型 C#可空类型 c#基础 开始记录我的追逐历程 - zfh424 Eds 模拟窗体 js 游戏 POP的使用组件
JavaScript中匿名函数,函数直接量和闭包(转)
zfh424 · 2009-02-04 · via 博客园 - zfh424
原文出处: http://www.dnew.cn/post/196.htm
先看下下面几种写法

1.function f(x){return x*x;};f(x);
2.(function(x){return x*x;})(x);
3.(function(x){return x*x;}(x));

第一种我们应该都很熟悉了,这是我们经常使用的写法。第二第三种都是匿名函数的写法。


第二种
可以这样理解:

  1. var f=function(x) {return x*x;};f()

那我们不通过f这个变量来引用函数就是

  1. function(){}()

然而这样肯定是错误的就像

  1. var f=1+2;
  2. f=f*0;

  1. var f=1+2*0;

结果不同一样。
要得到正确结果只能:

  1. f=(1+2)*0;

也就是要明确的标识出程序块,即:

  1. (function(){})()

肯你有疑问:括号“()”到底是不是起到了标识代码块的作用?
我们可以用JavaScript的内置函数检测一下!
举一个最简单的例子:

  1. alert(4)

这段代码会弹出提示内容是“4”
改成这样

  1. (alert)(4)

可以看到执行的效果和上一段代码一样。
这种形式的函数执行也被很多JavaScript框架所采用。


第三种,如果你用过jsvm框架的话就会发现里面的代码使用了这种形式。
那如何解释第三种情况呢?
为了弄明白浏览器是如何理解这样的写法的,我们可以利用一下Mozilla Firefox的错误控制台功能。
在代码中插入一段错误代码,代码段如下:

  1. (function(s){s+s}(1)).splice();

打开Mozilla Firefox的错误控制台,可以看到有如下的错误提示

错误: (function (s) {})(1) has no properties
源文件:file:///C:/Documents…….html
行:18

可以认为,浏览器对于

  1. (function(s){s+s}(1))

这样的代码按照

  1. (function (s) {s+s})(1)

来解析的。