专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Javascript教程 » javascript闭包:(转载)JavaScript中匿名函数 函数直接量和闭包 »正文

javascript闭包:(转载)JavaScript中匿名函数 函数直接量和闭包

来源: 发布时间:星期六, 2008年12月27日 浏览:163次 评论:0
原文出处: http://www.d.cn/post/196.htm
先看下下面几种写法
1.function f(x){ x*x;};f(x);
2.(function(x){ x*x;})(x);
3.(function(x){ x*x;}(x));
种我们应该都很熟悉了这是我们经常使用写法第 2第 3种都是匿名写法
--------------------------------------------------------------------------------
第 2种
可以这样理解:
var f=function(x) { 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框架所采用
--------------------------------------------------------------------------------
第 3种如果你用过jsvm框架话就会发现里面代码使用了这种形式
那如何解释第 3种情况呢?
为了弄明白浏览器是如何理解这样写法我们可以利用下Mozilla Firefox控制台功能
在代码中插入代码代码段如下:
(function(s){s+s}(1)).splice;
打开Mozilla Firefox控制台可以看到有如下提示
: (function (s) {})(1) has no properties
源文件:file:///C:/Documents…….html
行:18
可以认为浏览器对于
(function(s){s+s}(1))
这样代码按照
(function (s) {s+s})(1)
来解析

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

但是他们还是有区别
首先对于像第 2和第 3种形式其它和代码是不可能所定义种说发把这样称为匿名或者直接量
其次第 2和第 3种形式执行中间变量不会污染到全局命名空间你可以把中间代码看作纯粹子过程
当然使用后面两种形式定义可以很容易实现闭包
个例子:
/*
http://jibbering.com/faq/faq_notes/closures.html(D.CN注)
A global variable - getImgInPositionedDivHtml - is declared and
assigned the value of an inner function expression ed from
a _disibledevent= altText;
/* Return the created by joining each element in the
.gif' /> using an empty (which is the same as just
joining the elements together):-
*/
buffAr.join('');
}); //:End of inner function expression.
});
/*^^- :The inline execution of the outer function expression. */
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: