函式宣告之function與var

2021-07-25 18:58:32 字數 2218 閱讀 9543

紙上得來終覺淺,絕知此事要躬行。

軟體這行業,很多東西還是要靠敲**敲出來的,你以為看書看的很通透,例子也能做出來的東西,一需要深入混合運用頓時覺得懵逼了。關鍵還是在於一知半解,不夠深入。

今天我就總結一下近段時間遇到並糾結過的一些知識。

老規矩,由淺入深,用發散性思維思考每個知識點。

一、宣告乙個函式 function與var

1.function

aaa();    //先呼叫

function aaa()

js是按順序執行,但是這裡卻可以先呼叫再宣告

其原因是,js解析器都是先找到function宣告,然後再開始上下文執行,

所以函式已經提前被宣告,只是我們**順序顯示在後

要點,此時需要宣告與呼叫在同一作用域(作用域不同時請看後文)

2.var

var aaa = function();

這裡就是通常的解析過程,當解析器開始執行上下文之前,aaa是undefind(並未宣告),

只有上下文執行到var aaa = function。。。這句話時,aaa才被宣告並且當場賦值

例子1

function something() 

alert(something()); //??這裡會返回什麼

function something()

分析一下,首先js解析器會先找到functioin宣告,然後根據js特性後面會覆蓋前面,

再執行上下文,

所以這裡會輸出    world

例子2

var something = function() 

alert(something()); //??這裡會返回什麼

function something()

分析過程,

1.找到function宣告,function something(){}

2.執行上下文,var something;

3.執行上下文,賦值給something,成功覆蓋前面的something

4.輸出    

hello

剩下一些var function的位置自行腦補然後按以上思路解決,

記住,雖然內部解析有這樣的小差別,但是在外部看是一樣的,如果你用typeof測試something(),兩種返回的都是function

然後我們再往深入思考,

這種情況只要抓住一條重點,看作用域鏈

例子3

var scope = "global"; 

function f( )

var a = function();

a();

順著作用鏈,f先被宣告,然後執行上下文,scope賦值,接著執行函式a,a呼叫已宣告函式f,

f呼叫同一作用域鏈的外部變數scope,所以輸出    global

例子4

var ga = 'global';

var func = function()

} }

}a = func()()()();

根據

作用域鏈,層層呼叫,所以輸出    

local

global

然後就在弄清這些知識點時,我又發現另乙個不曾注意的新知識點:

變數在宣告它們的函式體以及這個函式體巢狀的任意函式體內都是有定義的

請看一下兩段**:

var scope="global";  

function f()

f();

輸出:undefind

local

var scope="global";  

function f()

f();

輸出 global

local

第一段**比第二段多了乙個var,結果大大不同

簡單點理解,就是上面講解var的時候,解析器先把var宣告成undefind

所以第一段**可以寫為

var scope="global";  

function f()

f();

Function函式的宣告方式

函式是一段可以反覆利用的 通過變數,把函式儲存到變數容器裡 var a function 因為沒有名字也被稱為匿名函式 後續需要呼叫 塊可直接使用變數名 a 直接宣告函式,function a 呼叫 塊方法 a 在函式內部呼叫自身的宣告方式。var a function text 建構函式var a...

python筆記之function函式

函式 對實現某一功能進行封裝,就是函式.特點 提高了 的復用性 函式的定義 def 函式名稱 引數 函式體 return 返回值 函式的呼叫 函式名 引數 函式的引數 形式引數 定義函式時設定的引數 實際引數 呼叫函式時設定的引數 函式的型別 無參無返回值函式 無參有返回值函式 有參無返回值函式 有...

function 函式宣告頭的提公升和預解析

即function語句的集合,就是將多個語句封裝到一起 函式的執行要會自己遍歷,遇見函式 a 執行語句,就要移交控制權,函式執行完畢之後,控制權又移交回來了!函式的引數要羅列在function定義的圓括號內sum a,b 用逗號隔開,叫做形式引數,呼叫的時候,圓括號裡面是實際引數sum 1,2 引數...