函數(shù)的兩種聲明方式
利用函數(shù)關(guān)鍵字進(jìn)行自定義(命名函數(shù))
function fn(){ } fu();
函數(shù)表達(dá)式(匿名函數(shù))
//var 變量名=function(){}; var fu=function(){ console.log('我是函數(shù)表達(dá)式'); }; //調(diào)用函數(shù) fu();
注意:
fu是變量名 不是函數(shù)名
函數(shù)表達(dá)式聲明跟聲明變量差不多,只不過變量里面存的是值黄选,函數(shù)表達(dá)式里面存的是函數(shù)
函數(shù)表達(dá)式也可以進(jìn)行參數(shù)傳遞
作用域
JS作用域:就是代碼名字(變量)在某個(gè)范圍內(nèi)起作用和效果,目的是為了提高程序的可靠性 ,更重要的是減少命名沖突
JavaScript (ES6前) 中的作用域有兩種:
全局作用域
局部作用域(函數(shù)作用域)
全局作用域
作用于所有代碼執(zhí)行的環(huán)境(整個(gè) script 標(biāo)簽內(nèi)部)或者一個(gè)獨(dú)立的 js 文件
局部(函數(shù))作用域
作用于函數(shù)內(nèi)的代碼環(huán)境,就是局部作用域咨演。 因?yàn)楦瘮?shù)有關(guān)系巢寡,所以也稱為函數(shù)作用域
JS沒有塊級(jí)作用域
塊作用域由 {} 包括
在其他編程語言中(如 java、c#等)亚隙,在 if 語句、循環(huán)語句中創(chuàng)建的變量违崇,僅僅只能在本 if 語句阿弃、本循環(huán)語句中使用,如下面的Java代碼:
if(true){ int num = 123; System.out.println(num); // 123 } System.out.println(num); // 報(bào)錯(cuò)
變量的作用域
在JS中根據(jù)作用域的不同羞延,變量可以分為兩種
全局變量
在全局作用域下聲明的變量叫做全局變量(在函數(shù)外部定義的變量)
全局變量在代碼的任何位置都可以使用
在全局作用域下 var 聲明的變量 是全局變量
特殊情況下渣淳,在函數(shù)內(nèi)不使用 var 聲明的變量也是全局變量(不建議使用)
局部變量
在局部作用域下聲明的變量叫做局部變量(在函數(shù)內(nèi)部定義的變量)
局部變量只能在該函數(shù)內(nèi)部使用
在函數(shù)內(nèi)部 var 聲明的變量是局部變量
函數(shù)的形參實(shí)際上就是局部變量
區(qū)別
全局變量:在任何一個(gè)地方都可以使用,只有在瀏覽器關(guān)閉時(shí)才會(huì)被銷毀伴箩,因此比較占內(nèi)存
局部變量:只在函數(shù)內(nèi)部使用水由,當(dāng)其所在的代碼塊被執(zhí)行時(shí),會(huì)被初始化;當(dāng)代碼塊運(yùn)行結(jié)束后砂客,就會(huì)被銷毀泥张,因此更節(jié)省內(nèi)存空間
作用域鏈
只要是代碼,就至少有一個(gè)作用域
寫在函數(shù)內(nèi)部的叫局部作用域
如果函數(shù)中還有函數(shù)鞠值,那么在這個(gè)作用域中就又可以誕生一個(gè)作用域
根據(jù)在內(nèi)部函數(shù)可以訪問外部函數(shù)變量的這種機(jī)制媚创,用鏈?zhǔn)讲檎覜Q定哪些數(shù)據(jù)能被內(nèi)部函數(shù)訪問,就稱作作用域鏈彤恶,采取就近原則
// 作用域鏈: 內(nèi)部函數(shù)訪問外部函數(shù)的變量钞钙,采取的是鏈?zhǔn)讲檎业姆绞絹頉Q定取哪個(gè)值,這種結(jié)構(gòu)我們稱為作用域鏈表 var num = 10; funtion fn() { //外部函數(shù) var num = 20; function fun() { //內(nèi)部函數(shù) console.log(num); // 20 ,一級(jí)一級(jí)訪問 } }
作用域鏈:采取就近原則的方式來查找變量最終的值