函式宣告和函式表示式的區別

2021-09-13 02:23:53 字數 1953 閱讀 1467

這裡是修真院前端小課堂,每篇分享文從

八個方面深度解析前端知識/技能,本篇分享的是:

【函式宣告和函式表示式的區別】

1.背景介紹

什麼是函式表示式?

這是mdn上關於函式表示式的介紹

這是另一種函式表示式的介紹

什麼是函式宣告?

簡單的demo看一下

既然知道了函式表示式和函式宣告,那麼如何區分他們?

如果沒有函式名稱,那麼肯定不是函式宣告方式。

區分帶有函式名稱的**是函式宣告還是函式表示式要通過它所在的上下文來判斷:

如果**作為乙個運算數存在,那麼它就是乙個表示式方式,否則就是函式宣告方式。

先看看他們之間的區別:

1、函式宣告會被提公升到當前作用域的頂部,函式表示式則不會。

2、函式宣告一定會有函式名,而函式表示式一般不會有函式名。

3、函式宣告不是乙個完整的語句,所以不能出現在if-else,for迴圈,

finally,try catch語句以及with語句中,

(ecma規範只允許他們作為頂級語句,但是有的瀏覽器並不遵循這個規則。)

直接看demo

2.知識剖析

函式(變數)提公升指的到底是什麼?怎麼解釋這個東西

我講過一次關於執行環境和作用域的小課堂。就拿全域性執行環境來說的話,當我們開啟網頁的時候,全域性執行環境建立,

這時候會建立這個執行環境的變數物件(活動物件),寫好作用域鏈,並將this指向這個活動物件。

第二步,會掃瞄整個執行環境中的函式宣告,以及var 變數宣告。都會提公升到當前執行環境的頂端,不過函式宣告是完整的

var關鍵字只是宣告變數,並未對其初始化。

第三步:按順序依次執行**。

還有其他種類的函式表示式嗎?

請看demo2

關於函式的呼叫

接著上面的話題,怎麼判斷乙個函式是函式表示式還是函式宣告

dome3演示

6.擴充套件思考

函式宣告一定會提公升嗎?一定會提公升到當前作用域的頂部嗎?

不一定,demo4

7.參考文獻

參考文獻

到底使用函式使用還是函式表示式?

dome4

問題:1、多個函式宣告提公升到頂部的排序是怎麼排序的? 

如果一格執行環境裡,有過個函式宣告,函式宣告提公升,是由**先後順序絕定的,先定義的函式宣告先提公升。

2、~function是什麼?

~function(){}(),一般是用來iife執行函式的,我們一般常見的是這種形式(funciton(){})()。但是前面加乙個按位非,也可以實現等同於()分組運算子的效果,不過並不建議使用,因為像~,-,void都會去改變一些返回值。最好還是用()的形式。

3、var min=function(){}

這裡當乙個執行環境建立的時候,我們除了把作用域鏈掛在活動物件前,this指向這個活動物件,然後就會掃瞄整個執行環境裡面的var 宣告,和函式宣告,var min 只會提公升 min變數,像這樣 var  min;放在當前作用域的頂端,先宣告乙個變數。

後面的函式表示式執行到這句才會進行賦值。

4、不要在if else while for迴圈等語句中去定義乙個函式宣告,定義函式表示式和呼叫函式都沒有問題。

函式宣告和函式表示式的區別

1.背景介紹 什麼是函式表示式?這是mdn上關於函式表示式的介紹 這是另一種函式表示式的介紹 什麼是函式宣告?簡單的demo看一下 既然知道了函式表示式和函式宣告,那麼如何區分他們?如果沒有函式名稱,那麼肯定不是函式宣告方式。區分帶有函式名稱的 是函式宣告還是函式表示式要通過它所在的上下文來判斷 如...

函式宣告和函式表示式

如果你知道這裡為什麼會報錯,那就請跳過.function fun var a fun a function1 var del function a,b console.log del 9,3 6 var mul function multiplay a,b mul 3,3 9 console.log...

函式表示式和函式宣告

函式表示式和函式宣告解密 在ecmascript中,建立函式的最常用的兩個方法是函式表示式和函式宣告,兩者期間的區別是有點暈,因為ecma規範只明確了一點 函式宣告必須帶有標示符 identifier 就是大家常說的函式名稱 而函式表示式則可以省略這個標示符 函式宣告 function 函式名稱 引...