国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

(轉載)JavaScript中匿名函數,函數直接量和閉包

2024-09-06 12:42:27
字體:
來源:轉載
供稿:網友
原文出處: 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));

第一種我們應該都很熟悉了,這是我們經常使用的寫法。第二第三種都是匿名函數的寫法。

--------------------------------------------------------------------------------

第二種
可以這樣理解:

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

可以認為,瀏覽器對于
(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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 赞皇县| 五指山市| 新泰市| 砚山县| 平乡县| 金昌市| 绥棱县| 珲春市| 治县。| 义乌市| 墨竹工卡县| 三门峡市| 卢氏县| 新沂市| 阿拉善左旗| 辽宁省| 斗六市| 溧水县| 朝阳县| 叶城县| 道孚县| 察雅县| 武隆县| 深圳市| 鄂托克前旗| 灯塔市| 琼中| 霞浦县| 临桂县| 平谷区| 平远县| 曲水县| 外汇| 安吉县| 宜州市| 铜山县| 凭祥市| 新营市| 广饶县| 茶陵县| 清徐县|