一、函數(shù)聲明與表達(dá)式
1.函數(shù)聲明
function fn(){
console.log('hello world');
}
fn();
fn();
function fn(){
console.log('HELLO JS');
}
//函數(shù)的聲明可以把函數(shù)的調(diào)用放在任何位置都可以執(zhí)行
2.函數(shù)表達(dá)式
相當(dāng)于把一個匿名函數(shù)賦值給一個變量
var foo=function(){
console.log('hello function');
}
foo();
//函數(shù)表達(dá)式中函數(shù)的調(diào)用不可以放在頂部零院,會報錯
二动看、立即執(zhí)行函數(shù)
我們之前使用的函數(shù)都是先定義,后調(diào)用崖媚。在JavaScript中我們可以定義一個函數(shù),讓他在定義的時候直接調(diào)用恤浪,我們叫他立即執(zhí)行函數(shù)
要想立即執(zhí)行函數(shù)能做到立即執(zhí)行畅哑,要注意兩點,
一是函數(shù)體后面要有小括號()资锰,
二是函數(shù)體必須是函數(shù)表達(dá)式而不能是函數(shù)聲明敢课。
案例
(function(test){
console.log(test);
})(123)
!(function(test){
console.log(test);
})(123)
+(function(test){
console.log(test);
})(123)
-(function(test){
console.log(test);
})(123)
var fun=function(test){
console.log(test);
}(123456);
//除了使用()運算符之外,绷杜!直秆,+,-鞭盟,=等運算符都能起到立即執(zhí)行的作用圾结。這些運算符的作用就是將匿名函數(shù)或函數(shù)聲明轉(zhuǎn)換為函數(shù)表達(dá)式
for(var i=0;i<10;i++){
setTimeout(function(){
console.log(i);
},1000)
上面的代碼不會輸出數(shù)字 0 到 9,而是會輸出數(shù)字 10 十次
想到得到數(shù)字0-9齿诉,可以使用匿名函數(shù)
for(var i=0;i<10;i++){
(function(e){
setTimeout(function(){
console.log(e)
},1000)
})(i)
}
三筝野、閉包
閉包是依賴于函數(shù)的晌姚,因為函數(shù)是js中唯一擁有自身作用域的結(jié)構(gòu)
1)函數(shù)的作用域
function fn1(){
var a=100;
console.log(a);
}
fn1();
function fn2(){
var b=200;
console.log(2);
}
fn2();
兩個單獨的函數(shù),分別都有自己的作用域歇竟,并且只能訪問自己作用域中的變量挥唠,而無法訪問其他作用域中的變量
如果想要兩個函數(shù)訪問其他函數(shù)作用域中的變量,這時候就需要函數(shù)的嵌套焕议。這時候就會形成閉包
閉包:閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)宝磨,也就是說,當(dāng)函數(shù)嵌套的時候盅安,我們可以叫內(nèi)部函數(shù)為閉包唤锉,利用閉包的特性,我們可以通過返回值的方式得到內(nèi)部函數(shù)中的變量
function fn1(){
var a=100;
console.log(a);
function fn2(){
var b=10;
console.log(b);
console.log(a);
return b;
}
return fn2;
}
fn1();
function fun1(){
var m=3;
function fun2(){
var n=5;
return n;
}
return fun2()
}
console.log(fun1);//5
//return n 相當(dāng)于把n的值給了fun2函數(shù),所以先在fun2函數(shù)的值就是5.再return fun2就相當(dāng)于把fun2的值再給了函數(shù)fun1;所以最后輸出fun1的值為5
上面的代碼中别瞭,我們通過兩個返回值把內(nèi)部函數(shù)的變量暴露出來窿祥,讓全局作用域可以獲取到這個變量,我們還可以進一步改變代碼蝙寨,讓內(nèi)部函數(shù)暴露晒衩,而不是讓內(nèi)部函數(shù)中的變量暴露
function fun1(){
var n=5;
function fun2(){
var m=3;
return m;
}
return fun2;
}
console.log(fun1());