上面的代碼確實簡單,我們可以逐步分解成下面的寫法: 復制代碼 代碼如下: var anonymousFunc = " /> 欧美在线一二三区,天天色综合天天,99v视频国产在线观看免费

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

通過javascript的匿名函數來分析幾段簡單有趣的代碼

1、簡單形式的封裝調用
復制代碼 代碼如下:
var userName = function() { return "jeff wong" } ();
alert(userName);


上面的代碼確實簡單,我們可以逐步分解成下面的寫法:
復制代碼 代碼如下:
var anonymousFunc = function() { return "jeff wong" }; //匿名函數
var name = anonymousFunc(); //執行該函數 返回人名
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); //匿名函數
//alert(a == b); //false
//alert(a === b); //false



正如你所看到的那樣,我們new一個Object,變量a彈出的是[object Object],而new一個Function(注意,是大寫Function),b在彈出的時候,生成了匿名函數。 既然b是匿名函數,函數當然可以執行,我們可以繼續試試下面的代碼驗證自己的猜測:
復制代碼 代碼如下:
alert(b()); //undefined
alert(a()); //腳本錯誤 提示“缺少函數”



3、new 一下function也大有乾坤(小寫function)
(1)、簡單的空函數
復制代碼 代碼如下:
var func = new function() { };
alert(typeof (func)); //object
alert(func); //[object Object]
//alert(func()); //腳本錯誤 func不是函數



其實上面的代碼也就等價于下面的寫法:
復制代碼 代碼如下:
function anonymousClass() { } //匿名類
var instance = new anonymousClass();
alert(typeof (instance));//object
alert(instance); //[object Object]

[code]

(2)、函數帶個返回值的,也不是很難理解
[code]
var func = new function() { return "jeff wong" };
alert(typeof (func));
alert(func);
//alert(func()); //腳本錯誤 缺少函數



其實上面的代碼也就等價于下面的寫法:
復制代碼 代碼如下:
function anonymousClass() { return "jeff wong"; } //匿名類
var instance = new anonymousClass();
alert(typeof (instance));//object
alert(instance); //[object Object]


(3)、還是函數帶個返回值的,寫法稍微有點不同

下面的代碼請注意和(2)中的區分一下,因為接下來要重點討論的就是那一點點的不同書寫形式:
復制代碼 代碼如下:
var func = new function() { return new String("jeff wong"); };
alert(typeof (func)); //object 意料之中
alert(func); //這里?!
//alert(func()); //腳本錯誤 缺少函數



上面代碼的等價形式依然簡單:
復制代碼 代碼如下:
function anonymousClass() { return new String("jeff wong"); }
var instance = new anonymousClass();
alert(typeof (instance));
alert(instance);


已經運行看到結果了嗎?沒錯,第三種寫法我們在彈出func或者instance的時候,都出人意料地得到了一段字符串"jeff wong"。細心比較(2)和(3)中的代碼,除了return處的寫法稍有不同之外,兩處代碼幾乎完全一致,所以我們推斷,毫無疑問,是new String的形式讓我們的函數產生了意想不到的效果。 為什么會這樣呢?

原來,在Javascript中,只要在new表達式之后的constructor返回(return)一個原始類型(無return時其實是return原始類型undefined,如(1)),比如第(2)種寫法,那么就返回new創建的匿名對象;而如果new表達式之后的constructor返回一個引用對象,比如對象(Object),函數(function)及數組(Array)等等,那么返回的該引用對象就將覆蓋new創建的匿名對象。現在再來分析(3)中的寫法,由于new String會構造一個字符串引用對象,它就覆蓋了new所創建的匿名對象,而new String的所指向引用值是“jeff wong”,所以彈出的必然是當前new String所分配的值。

  最后,留個思考題,大家看看下面的代碼返回什么結果:

復制代碼 代碼如下:
var func = new function() { var str = new String("jeff wong"); return str; };//再換種寫法
//alert(typeof (func)); //object 意料之中
alert(func); //猜一下這里應該是什么結果?

作者:Jeff Wong

JavaScript技術通過javascript的匿名函數來分析幾段簡單有趣的代碼,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 免费人成在线蜜桃视频 | 99视频在线精品免费 | 国产永久视频 | 免费四虎永久在线精品 | 国内外成人在线视频 | 91专区在线 | 国产一区二区三区免费视频 | 精品国产午夜肉伦伦影院 | 一区二区三区在线免费视频 | 天天干天天干天天干 | 女人被爽到呻吟娇喘的视频动态图 | 老司机51精品视频在线观看 | 国产一区中文字幕在线观看 | 九九久久精品国产 | 国产一区二区视频在线 | 91精品国产91久久久久久最新 | 色哟呦| 精品日本久久久久久久久久 | 欧美日韩乱国产 | 欧美一级艳片爽快片 | 久久国产一区二区 | 免费午夜视频在线观看 | 在线成人综合色一区 | 巨胸喷奶水www久久久免费观看 | 精品国产第一页 | 亚洲网美女 | 777福利| 欧美网站色 | 91精彩视频在线观看 | 婷婷快播| 韩国三级久久精品 | 伊人射| 久久久高清日本道免费观看 | 一级做a爰久久毛片武则天 一级做a爰毛片 | 999精品视频在线 | 美女牲交视频一级毛片 | 亚洲一区二区影院 | 亚洲经典激情春色另类 | 久久久久国产一级毛片高清片 | 亚州一级毛片 | 国产黄色片在线播放 |