通過javascript的匿名函數(shù)來分析幾段簡單有趣的代碼
更新時間:2010年06月29日 01:19:19 作者:
想起自己很久以前學(xué)習(xí)javascript的經(jīng)歷,也曾經(jīng)碰到過幾個由匿名函數(shù)造成的困擾(其中一個就是由閉包引起的),下面就整理幾段簡單代碼討論一下,讓我們大家一起進(jìn)步。
1、簡單形式的封裝調(diào)用
var userName = function() { return "jeff wong" } ();
alert(userName);
上面的代碼確實(shí)簡單,我們可以逐步分解成下面的寫法:
var anonymousFunc = function() { return "jeff wong" }; //匿名函數(shù)
var name = anonymousFunc(); //執(zhí)行該函數(shù) 返回人名
alert(name);
2、new 一下Function的形式(大寫Function)
var a = new Object();
var b = new Function();
//alert(typeof (a)); //object
//alert(typeof (b)); //function
alert(a); //[object Object]
alert(b); //匿名函數(shù)
//alert(a == b); //false
//alert(a === b); //false
正如你所看到的那樣,我們new一個Object,變量a彈出的是[object Object],而new一個Function(注意,是大寫Function),b在彈出的時候,生成了匿名函數(shù)。 既然b是匿名函數(shù),函數(shù)當(dāng)然可以執(zhí)行,我們可以繼續(xù)試試下面的代碼驗(yàn)證自己的猜測:
alert(b()); //undefined
alert(a()); //腳本錯誤 提示“缺少函數(shù)”
3、new 一下function也大有乾坤(小寫function)
(1)、簡單的空函數(shù)
var func = new function() { };
alert(typeof (func)); //object
alert(func); //[object Object]
//alert(func()); //腳本錯誤 func不是函數(shù)
其實(shí)上面的代碼也就等價于下面的寫法:
function anonymousClass() { } //匿名類
var instance = new anonymousClass();
alert(typeof (instance));//object
alert(instance); //[object Object]
[code]
(2)、函數(shù)帶個返回值的,也不是很難理解
[code]
var func = new function() { return "jeff wong" };
alert(typeof (func));
alert(func);
//alert(func()); //腳本錯誤 缺少函數(shù)
其實(shí)上面的代碼也就等價于下面的寫法:
function anonymousClass() { return "jeff wong"; } //匿名類
var instance = new anonymousClass();
alert(typeof (instance));//object
alert(instance); //[object Object]
(3)、還是函數(shù)帶個返回值的,寫法稍微有點(diǎn)不同
下面的代碼請注意和(2)中的區(qū)分一下,因?yàn)榻酉聛硪攸c(diǎn)討論的就是那一點(diǎn)點(diǎn)的不同書寫形式:
var func = new function() { return new String("jeff wong"); };
alert(typeof (func)); //object 意料之中
alert(func); //這里?!
//alert(func()); //腳本錯誤 缺少函數(shù)
上面代碼的等價形式依然簡單:
function anonymousClass() { return new String("jeff wong"); }
var instance = new anonymousClass();
alert(typeof (instance));
alert(instance);
已經(jīng)運(yùn)行看到結(jié)果了嗎?沒錯,第三種寫法我們在彈出func或者instance的時候,都出人意料地得到了一段字符串"jeff wong"。細(xì)心比較(2)和(3)中的代碼,除了return處的寫法稍有不同之外,兩處代碼幾乎完全一致,所以我們推斷,毫無疑問,是new String的形式讓我們的函數(shù)產(chǎn)生了意想不到的效果。 為什么會這樣呢?
原來,在javascript中,只要在new表達(dá)式之后的constructor返回(return)一個原始類型(無return時其實(shí)是return原始類型undefined,如(1)),比如第(2)種寫法,那么就返回new創(chuàng)建的匿名對象;而如果new表達(dá)式之后的constructor返回一個引用對象,比如對象(Object),函數(shù)(function)及數(shù)組(Array)等等,那么返回的該引用對象就將覆蓋new創(chuàng)建的匿名對象。現(xiàn)在再來分析(3)中的寫法,由于new String會構(gòu)造一個字符串引用對象,它就覆蓋了new所創(chuàng)建的匿名對象,而new String的所指向引用值是“jeff wong”,所以彈出的必然是當(dāng)前new String所分配的值。
最后,留個思考題,大家看看下面的代碼返回什么結(jié)果:
var func = new function() { var str = new String("jeff wong"); return str; };//再換種寫法
//alert(typeof (func)); //object 意料之中
alert(func); //猜一下這里應(yīng)該是什么結(jié)果?
作者:Jeff Wong
復(fù)制代碼 代碼如下:
var userName = function() { return "jeff wong" } ();
alert(userName);
上面的代碼確實(shí)簡單,我們可以逐步分解成下面的寫法:
復(fù)制代碼 代碼如下:
var anonymousFunc = function() { return "jeff wong" }; //匿名函數(shù)
var name = anonymousFunc(); //執(zhí)行該函數(shù) 返回人名
alert(name);
2、new 一下Function的形式(大寫Function)
復(fù)制代碼 代碼如下:
var a = new Object();
var b = new Function();
//alert(typeof (a)); //object
//alert(typeof (b)); //function
alert(a); //[object Object]
alert(b); //匿名函數(shù)
//alert(a == b); //false
//alert(a === b); //false
正如你所看到的那樣,我們new一個Object,變量a彈出的是[object Object],而new一個Function(注意,是大寫Function),b在彈出的時候,生成了匿名函數(shù)。 既然b是匿名函數(shù),函數(shù)當(dāng)然可以執(zhí)行,我們可以繼續(xù)試試下面的代碼驗(yàn)證自己的猜測:
復(fù)制代碼 代碼如下:
alert(b()); //undefined
alert(a()); //腳本錯誤 提示“缺少函數(shù)”
3、new 一下function也大有乾坤(小寫function)
(1)、簡單的空函數(shù)
復(fù)制代碼 代碼如下:
var func = new function() { };
alert(typeof (func)); //object
alert(func); //[object Object]
//alert(func()); //腳本錯誤 func不是函數(shù)
其實(shí)上面的代碼也就等價于下面的寫法:
復(fù)制代碼 代碼如下:
function anonymousClass() { } //匿名類
var instance = new anonymousClass();
alert(typeof (instance));//object
alert(instance); //[object Object]
[code]
(2)、函數(shù)帶個返回值的,也不是很難理解
[code]
var func = new function() { return "jeff wong" };
alert(typeof (func));
alert(func);
//alert(func()); //腳本錯誤 缺少函數(shù)
其實(shí)上面的代碼也就等價于下面的寫法:
復(fù)制代碼 代碼如下:
function anonymousClass() { return "jeff wong"; } //匿名類
var instance = new anonymousClass();
alert(typeof (instance));//object
alert(instance); //[object Object]
(3)、還是函數(shù)帶個返回值的,寫法稍微有點(diǎn)不同
下面的代碼請注意和(2)中的區(qū)分一下,因?yàn)榻酉聛硪攸c(diǎn)討論的就是那一點(diǎn)點(diǎn)的不同書寫形式:
復(fù)制代碼 代碼如下:
var func = new function() { return new String("jeff wong"); };
alert(typeof (func)); //object 意料之中
alert(func); //這里?!
//alert(func()); //腳本錯誤 缺少函數(shù)
上面代碼的等價形式依然簡單:
復(fù)制代碼 代碼如下:
function anonymousClass() { return new String("jeff wong"); }
var instance = new anonymousClass();
alert(typeof (instance));
alert(instance);
已經(jīng)運(yùn)行看到結(jié)果了嗎?沒錯,第三種寫法我們在彈出func或者instance的時候,都出人意料地得到了一段字符串"jeff wong"。細(xì)心比較(2)和(3)中的代碼,除了return處的寫法稍有不同之外,兩處代碼幾乎完全一致,所以我們推斷,毫無疑問,是new String的形式讓我們的函數(shù)產(chǎn)生了意想不到的效果。 為什么會這樣呢?
原來,在javascript中,只要在new表達(dá)式之后的constructor返回(return)一個原始類型(無return時其實(shí)是return原始類型undefined,如(1)),比如第(2)種寫法,那么就返回new創(chuàng)建的匿名對象;而如果new表達(dá)式之后的constructor返回一個引用對象,比如對象(Object),函數(shù)(function)及數(shù)組(Array)等等,那么返回的該引用對象就將覆蓋new創(chuàng)建的匿名對象。現(xiàn)在再來分析(3)中的寫法,由于new String會構(gòu)造一個字符串引用對象,它就覆蓋了new所創(chuàng)建的匿名對象,而new String的所指向引用值是“jeff wong”,所以彈出的必然是當(dāng)前new String所分配的值。
最后,留個思考題,大家看看下面的代碼返回什么結(jié)果:
復(fù)制代碼 代碼如下:
var func = new function() { var str = new String("jeff wong"); return str; };//再換種寫法
//alert(typeof (func)); //object 意料之中
alert(func); //猜一下這里應(yīng)該是什么結(jié)果?
作者:Jeff Wong
您可能感興趣的文章:
- (轉(zhuǎn)載)JavaScript中匿名函數(shù),函數(shù)直接量和閉包
- Javascript的匿名函數(shù)講解
- Javascript的匿名函數(shù)小結(jié)
- javascript 匿名函數(shù)的理解(透徹版)
- JavaScript 編寫匿名函數(shù)的幾種方法
- Javascript 匿名函數(shù)及其代碼模式原理
- Javascript匿名函數(shù)的一種應(yīng)用 代碼封裝
- JavaScript 匿名函數(shù)(anonymous function)與閉包(closure)
- 一個關(guān)于javascript匿名函數(shù)的問題分析
- Javascript中的回調(diào)函數(shù)和匿名函數(shù)的回調(diào)示例介紹
- 詳談JavaScript 匿名函數(shù)及閉包
- JavaScript函數(shù)的一些注意要點(diǎn)小結(jié)及js匿名函數(shù)
相關(guān)文章
限制文本框只能輸入數(shù)字||只能是數(shù)字和小數(shù)點(diǎn)||只能是整數(shù)和浮點(diǎn)數(shù)
這篇文章主要介紹了限制文本框只能輸入數(shù)字||只能是數(shù)字和小數(shù)點(diǎn)||只能是整數(shù)和浮點(diǎn)數(shù)的實(shí)例代碼,非常不錯,也比較實(shí)用,需要的小伙伴一起看下吧2016-05-05Layui數(shù)據(jù)表格之獲取表格中所有的數(shù)據(jù)方法
今天小編就為大家分享一篇Layui數(shù)據(jù)表格之獲取表格中所有的數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08使用json對象轉(zhuǎn)化為key,value的對象數(shù)組
這篇文章主要介紹了使用json對象轉(zhuǎn)化為key,value的對象數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06JS組件系列之Bootstrap Icon圖標(biāo)選擇組件
這篇文章給大家介紹js組件系列之Bootstrap Icon圖標(biāo)選擇組件,對bootstrap icon圖標(biāo)相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-01-01使用SyntaxHighlighter實(shí)現(xiàn)HTML高亮顯示代碼的方法
syntaxhighlighter是一個小開源項(xiàng)目,它可以在網(wǎng)頁中對各種程序源代碼語法進(jìn)行加亮顯示。2010-02-02