js第二十六天

一、函數(shù)聲明與表達式

1.函數(shù)聲明

function fn(){
console.log('hello world');
}
fn();

fn();
function fn(){
console.log('HELLO JS');
}
//函數(shù)的聲明可以把函數(shù)的調(diào)用放在任何位置都可以執(zhí)行
2.函數(shù)表達式

相當于把一個匿名函數(shù)賦值給一個變量

var foo=function(){
console.log('hello function');
}
foo();

//函數(shù)表達式中函數(shù)的調(diào)用不可以放在頂部,會報錯
二、立即執(zhí)行函數(shù)

我們之前使用的函數(shù)都是先定義,后調(diào)用。在JavaScript中我們可以定義一個函數(shù),讓他在定義的時候直接調(diào)用,我們叫他立即執(zhí)行函數(shù)

要想立即執(zhí)行函數(shù)能做到立即執(zhí)行,要注意兩點,
一是函數(shù)體后面要有小括號(),
二是函數(shù)體必須是函數(shù)表達式而不能是函數(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ù)表達式
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ù),也就是說,當函數(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 相當于把n的值給了fun2函數(shù),所以先在fun2函數(shù)的值就是5.再return fun2就相當于把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());

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,546評論 0 13
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,120評論 2 17
  • 一、函數(shù)聲明與表達式 1.函數(shù)聲明 function fn(){ console.log('hello wor...
    Polaris_L閱讀 452評論 0 0
  • 立即執(zhí)行函數(shù): 一、計時器 一次性定時器 setTimeOut(function(){ //1秒后執(zhí)行 },100...
    辭蘇閱讀 308評論 0 0
  • 一、 計時器 一次性定時器 setTimeOut(function(){ ...
    蕭聲斷未央閱讀 204評論 0 0

友情鏈接更多精彩內(nèi)容