在 es6 出來之前,沒有塊級作用域,只有全域性作用域 和 函式作用域。
變數提公升指的是 將變數宣告提公升到它所在作用域的最開始部分。
例子:
console.log(foo); //undefined
var foo = '變數提公升';
console.log(foo)
//變數提公升
相當於:
varfoo;
console.log(foo)
//undefined
foo = '變數提公升';
console.log(foo);
//變數提公升
函式建立有兩種方式,一種是函式宣告形式,一種是函式字面量形式,而只有 函式宣告形式 才有函式提公升。
例子:
console.log(bar); //f bar()
console.log(bar()); //
undefined
var bar = 456;
function
bar()
console.log(bar);
//456
bar = 789;
console.log(bar);
//789
console.log(bar()) //
bar is not a function
相當於:
//函式提公升,函式提公升優先順序高於變數提公升
var bar = function
() ;
//變數提公升,變數提公升不會覆蓋(同名)函式提公升,只有變數再次賦值時,才會被覆蓋
varbar;
console.log(bar);
console.log(bar());
//變數賦值,覆蓋同名函式字面量
bar = 456;
console.log(bar);
//再次賦值
bar = 789console.log(bar);
console.log(bar())
函式提公升優先順序高於變數提公升,且不會被同名變數宣告時覆蓋,但是會被變數賦值後覆蓋。
例子:
var getname = function()function
getname ()
getname();
相當於:
functiongetname ()
var getname = function
()getname();
//2
隨筆整理自
感謝博主分享!
js變數提公升與函式提公升的過程
先來看兩個栗子,下面的兩段 分別輸出什麼?段1 function foo console.log a foo 段2 function foo console.log a foo 答案是 段1列印的是1,段2列印的是 a 函式。為什麼會這樣呢?這就涉及到js中的變數提公升和函式提公升的具體過程了。js...
變數提公升與函式提公升
定義 var宣告的變數,js在執行時會將其宣告提公升到它所在作用域的頂端去執行,到我們 所在的位置來賦值。console.log a undefinded,因為一開始執行了var a var a 123console.log v1 undefined var v1 100 function func...
JS函式提公升和變數提公升
js引擎在執行整個js 的過程中,分為倆步。第一步是讀取和解析js 第二部是執行。在引擎解析js 的時候,當解析器遇見變數宣告 var 變數名 和函式宣告 function 函式名 的時候,會將這些宣告提到各自作用域的最前面。在es6之前,js是沒有塊級作用域的。只有2種作用域 注 在其他語言中,被...