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í)行任何代碼之前可以訪問;而函數(shù)表達(dá)式則必須等到解析器執(zhí)行到它所在的代碼行才會(huì)真正被解釋執(zhí)行。
自執(zhí)行函數(shù)嚴(yán)格來說也叫函數(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ù):
//可用來傳參
(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)檫@種語法會(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ù)來執(zhí)行。
相關(guān)文章
JavaScript展開操作符(Spread operator)詳解
在本篇文章里小編給大家整理的是關(guān)于JavaScript展開操作符(Spread operator)的詳細(xì)介紹以及用法,需要的讀者們參考下。2019-07-07
JavaScript常用字符串與數(shù)組擴(kuò)展函數(shù)小結(jié)
這篇文章主要介紹了一些JavaScript常用字符串與數(shù)組擴(kuò)展函數(shù),整理了一些簡單而使用率又高的操作String與Array的函數(shù),需要的朋友可以參考下2016-04-04
javascript下for循環(huán)用法小結(jié)
javascript下for循環(huán)用法小結(jié)...2007-07-07
JavaScript中prototype為對(duì)象添加屬性的誤區(qū)介紹
prototype為對(duì)象添加屬性的的過程中有些誤區(qū),在本文將為大家詳細(xì)介紹下,感興趣的朋友可不要錯(cuò)過2013-10-10
JavaScript中的getMilliseconds()方法使用詳解
這篇文章主要介紹了JavaScript中的getMilliseconds()方法使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06

