JS中創(chuàng)建函數(shù)的三種方式及區(qū)別
1.函數(shù)聲明
function sum1(n1,n2){ return n1+n2; };
2.函數(shù)表達(dá)式,又叫函數(shù)字面量
var sum2=function(n1,n2){ return n1+n2; };
兩者的區(qū)別:解析器會(huì)先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可以訪問(wèn);而函數(shù)表達(dá)式則必須等到解析器執(zhí)行到它所在的代碼行才會(huì)真正被解釋執(zhí)行。
自執(zhí)行函數(shù)嚴(yán)格來(lái)說(shuō)也叫函數(shù)表達(dá)式,它主要用于創(chuàng)建一個(gè)新的作用域,在此作用域內(nèi)聲明的變量,不會(huì)和其它作用域內(nèi)的變量沖突或混淆,大多是以匿名函數(shù)方式存在,且立即自動(dòng)執(zhí)行。
(function(n1,n2){ console.log (n1+n2) })(1,3);//4
另外幾種自執(zhí)行函數(shù):
//可用來(lái)傳參 (function(x,y){ console.log(x+y); })(2,3); //帶返回值 var sum=(function(x,y){ return x+y; })(2,3); console.log(sum); ~function(){ var name='~' console.log(name); }(); !function(){ var name='!' console.log(name); }(); ;(function(){ var name=';' console.log(name); })(); -function(){ var name='-' console.log(name); }(); //逗號(hào)運(yùn)算符 1,function(){ var name=','; console.log(name); }(); //異或 1^function(){ var name='^'; console.log(name); }(); //比較運(yùn)算符 1>function(){ var name='>'; console.log(name); }(); ~+-!(function(){ var name='~+-!'; console.log(name); })(); ~!(function(){ var name='~!'; console.log(name); })(); (function(){ var name='call'; console.log(name); }).call(); (function(){ var name='apply'; console.log(name); }).apply();
3.函數(shù)構(gòu)造法,參數(shù)必須加引號(hào)
var sum3=new Function('n1','n2','return n1+n2'); console.log(sum3(2,3));//5
從技術(shù)角度講,這是一個(gè)函數(shù)表達(dá)式。一般不推薦用這種方法定義函數(shù),因?yàn)檫@種語(yǔ)法會(huì)導(dǎo)致解析兩次代碼(第一次是解析常規(guī)ECMAScript代碼,第二次是解析傳入構(gòu)造函數(shù)中的字符串),從而影響性能。
var name='haoxl'; function fun(){ var name='lili'; return new Function('return name');//不能獲取局部變量 } console.log(fun()());//haoxl
Function()構(gòu)造函數(shù)每次執(zhí)行時(shí)都會(huì)解析函數(shù)主體,并創(chuàng)建一個(gè)新的函數(shù)對(duì)象,所以當(dāng)在一個(gè)循環(huán)或頻繁執(zhí)行的函數(shù)中調(diào)用Function()構(gòu)造函數(shù)效率是非常低的。而函數(shù)字面量卻不是每次遇到都會(huì)重新編譯的,用Function()構(gòu)造函數(shù)創(chuàng)建一個(gè)函數(shù)時(shí)并不遵循典型的作用域,它一直把它當(dāng)作是頂級(jí)函數(shù)來(lái)執(zhí)行。
相關(guān)文章
了解JavaScript函數(shù)中的默認(rèn)參數(shù)
JavaScript函數(shù)可以有默認(rèn)參數(shù)值。通過(guò)默認(rèn)函數(shù)參數(shù),你可以初始化帶有默認(rèn)值的正式參數(shù)。下面我們來(lái)一起學(xué)習(xí)一下吧2019-05-05js onkeypress與onkeydown 事件區(qū)別詳細(xì)說(shuō)明
本文將詳細(xì)介紹js onkeypress與onkeydown 事件區(qū)別:一個(gè)放開(kāi)一個(gè)沒(méi)有放開(kāi),onkeydown先于onkeypress 發(fā)生,需要的朋友可以參考下2012-12-12JavaScript對(duì)象學(xué)習(xí)經(jīng)驗(yàn)整理
主要包括對(duì)象的創(chuàng)建、對(duì)象屬性的設(shè)置和查詢、對(duì)象方法等等,整理如下,感興趣的朋友可以參考下2013-10-10詳解JavaScript中undefined與null的區(qū)別
大多數(shù)計(jì)算機(jī)語(yǔ)言,有且僅有一個(gè)表示"無(wú)"的值,比如,C語(yǔ)言的NULL,Java語(yǔ)言的null,Python語(yǔ)言的none,Ruby語(yǔ)言的nil2014-03-03JavaScript中的toDateString()方法使用詳解
這篇文章主要介紹了JavaScript中的toDateString()方法使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06javascript Window及document對(duì)象詳細(xì)整理
注:頁(yè)面上元素name屬性以及JavaScript引用的名稱必須一致包括大小寫(xiě)否則會(huì)提示你1個(gè)錯(cuò)誤信息 引用的元素為空或者不是對(duì)象2011-01-01