JavaScript中匿名函数,函数直接量和闭包
来源:互联网 发布:xlsx.core.min.js 编辑:程序博客网 时间:2024/05/22 01:44
原文出处: http://www.dnew.cn/post/196.htm
先看下下面几种写法
第一种我们应该都很熟悉了,这是我们经常使用的写法。第二第三种都是匿名函数的写法。
第二种
可以这样理解:
那我们不通过f这个变量来引用函数就是
然而这样肯定是错误的就像
与
结果不同一样。
要得到正确结果只能:
也就是要明确的标识出程序块,即:
肯你有疑问:括号“()”到底是不是起到了标识代码块的作用?
我们可以用JavaScript的内置函数检测一下!
举一个最简单的例子:
这段代码会弹出提示内容是“4”
改成这样
可以看到执行的效果和上一段代码一样。
这种形式的函数执行也被很多JavaScript框架所采用。
第三种,如果你用过jsvm框架的话就会发现里面的代码使用了这种形式。
那如何解释第三种情况呢?
为了弄明白浏览器是如何理解这样的写法的,我们可以利用一下Mozilla Firefox的错误控制台功能。
在代码中插入一段错误代码,代码段如下:
打开Mozilla Firefox的错误控制台,可以看到有如下的错误提示
可以认为,浏览器对于这样的代码按照
来解析的。
到此可能你有这样的认识:
但是他们还是有区别的,
首先,对于像第二和第三种形式,其它的函数和代码是不可能调用所定义的函数的,有一种说发把这样的函数称为匿名函数或者函数直接量。
其次,第二和第三种形式执行的函数,中间变量不会污染到全局命名空间,你可以把中间的代码看作纯粹的子过程调用。
当然使用后面两种形式的函数定义可以很容易的实现闭包。
看一个例子:
先看下下面几种写法
1.function f(x){return x*x;};f(x);
2.(function(x){return x*x;})(x);
3.(function(x){return x*x;}(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
源文件:file:///C:/Documents…….html
行:18
源文件:file:///C:/Documents…….html
行: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));
但是他们还是有区别的,
首先,对于像第二和第三种形式,其它的函数和代码是不可能调用所定义的函数的,有一种说发把这样的函数称为匿名函数或者函数直接量。
其次,第二和第三种形式执行的函数,中间变量不会污染到全局命名空间,你可以把中间的代码看作纯粹的子过程调用。
当然使用后面两种形式的函数定义可以很容易的实现闭包。
看一个例子:
- /*
- http://jibbering.com/faq/faq_notes/closures.html(Dnew.CN注)
- A global variable - getImgInPositionedDivHtml - is declared and
- assigned the value of an inner function expression returned from
- a one-time call to an outer function expression.
- That inner function returns a string of HTML that represents an
- absolutely positioned DIV wrapped round an IMG element, such that
- all of the variable attribute values are provided as parameters
- to the function call:-
- */
- var getImgInPositionedDivHtml = (function(){
- /* The - buffAr - Array is assigned to a local variable of the
- outer function expression. It is only created once and that one
- instance of the array is available to the inner function so that
- it can be used on each execution of that inner function.
- Empty strings are used as placeholders for the date that is to
- be inserted into the Array by the inner function:-
- */
- var buffAr = [
- '<div id="',
- '', //index 1, DIV ID attribute
- '" style="position:absolute;top:',
- '', //index 3, DIV top position
- 'px;left:',
- '', //index 5, DIV left position
- 'px;width:',
- '', //index 7, DIV width
- 'px;height:',
- '', //index 9, DIV height
- 'px;overflow:hidden;/"><img src=/"',
- '', //index 11, IMG URL
- '/" width=/"',
- '', //index 13, IMG width
- '/" height=/"',
- '', //index 15, IMG height
- '/" alt=/"',
- '', //index 17, IMG alt text
- '/"><//div>'
- ];
- /* Return the inner function object that is the result of the
- evaluation of a function expression. It is this inner function
- object that will be executed on each call to -
- getImgInPositionedDivHtml( ... ) -:-
- */
- return (function(url, id, width, height, top, left, altText){
- /* Assign the various parameters to the corresponding
- locations in the buffer array:-
- */
- buffAr[1] = id;
- buffAr[3] = top;
- buffAr[5] = left;
- buffAr[13] = (buffAr[7] = width);
- buffAr[15] = (buffAr[9] = height);
- buffAr[11] = url;
- buffAr[17] = altText;
- /* Return the string created by joining each element in the
- array using an empty string (which is the same as just
- joining the elements together):-
- */
- return buffAr.join('');
- }); //:End of inner function expression.
- })();
- /*^^- :The inline execution of the outer function expression. */
- JavaScript中匿名函数,函数直接量和闭包
- (转载)JavaScript中匿名函数,函数直接量和闭包
- JavaScript中匿名函数,函数直接量和闭包(转)
- JavaScript中匿名函数,函数直接量和闭包(转)
- javascript函数解析2匿名函数,函数直接量
- javascript:复习匿名函数和闭包
- javascript匿名函数和闭包
- javascript里匿名函数和闭包
- JavaScript之匿名函数和闭包
- javascript的闭包和匿名函数
- 【JavaScript】匿名函数和闭包
- 【JavaScript】匿名函数和闭包
- JavaScript匿名函数和闭包
- JavaScript 匿名函数和闭包
- JavaScript学习-匿名函数和闭包
- javascript中函数直接量函数构造函数应用详解
- Javascript函数字面量演绎匿名函数
- javascript函数直接量(function(){})()
- 基于applet的FTP断点上传组件(二)
- awk(一)
- TFS(Team Foundation Server)介绍和入门
- 硬盘分区
- 转载:设计模式
- JavaScript中匿名函数,函数直接量和闭包
- winbootmgr.cpp
- 3D开发初探
- 收藏__国人应该知道的知识
- IAT HOOK 代码注入非DLL
- 从孙子兵法论SOA
- 微软开发项目大揭密——《代码之道》
- CallableStatement 接口
- 海明校验+循环冗余校验码