js函式 變數提公升 hoisting

2022-04-28 05:05:55 字數 938 閱讀 3770

其實我只是想複習下變數提公升的,然後看到了函式提公升,然後再看到了函式宣告、函式表示式.

有必要懷著敬仰之心提及園子裡的tom大叔的解密命名函式表示式,不愧是大叔,好好地腦補了下基礎知識.

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

函式宣告:

function 函式名稱(引數:可選)

函式表示式:

function 函式名稱(可選)(引數:可選)

所以,可以看出,如果不宣告函式名稱,它肯定是表示式,可如果宣告了函式名稱的話,如何判斷是函式宣告還是函式表示式呢?ecmascript是通過上下文來區分的,如果function foo(){}是作為賦值表示式的一部分的話,那它就是乙個函式表示式,如果function foo(){}被包含在乙個函式體內,或者位於程式的最頂部的話,那它就是乙個函式宣告。

function foo(){} //

宣告,因為它是程式的一部分

var bar = function foo(){}; //

表示式,因為它是賦值表示式的一部分

newfunction bar(){}; //

表示式,因為它是new表示式

(function() //

宣告,因為它是函式體的一部分

})();

總之:函式及變數的宣告都將被提公升到函式的最頂部。 

函式宣告,函式的宣告以及定義都提公升,函式表示式和變數表示式只是將函式或者變數的宣告提公升到函式頂部,而函式表示式和變數的初始化將不被提公升.

js 變數 函式提公升

js 變數 函式提公升 先簡單理解下作用域的概念,方便對變數與函式提公升的概念的理解 function foo console.log x foo 2結果為2,可見js中並沒有塊級作用域的概念 可以使用下面的方法創造自己的作用域,這樣不會干擾到外部變數 function foo console.lo...

JS函式提公升和變數提公升

js引擎在執行整個js 的過程中,分為倆步。第一步是讀取和解析js 第二部是執行。在引擎解析js 的時候,當解析器遇見變數宣告 var 變數名 和函式宣告 function 函式名 的時候,會將這些宣告提到各自作用域的最前面。在es6之前,js是沒有塊級作用域的。只有2種作用域 注 在其他語言中,被...

JS 變數提公升與函式提公升

在 es6 出來之前,沒有塊級作用域,只有全域性作用域 和 函式作用域。變數提公升指的是 將變數宣告提公升到它所在作用域的最開始部分。例子 console.log foo undefined var foo 變數提公升 console.log foo 變數提公升 相當於 var foo consol...