為什麼全域性變數在賦值之前呼叫會報錯

2022-03-27 19:13:12 字數 886 閱讀 4217

參考文獻

一、在宣告區域性變數前,呼叫區域性變數返回undefind

function f() 

f(); //undefind

二、在全域性變數賦值前,呼叫全域性變數會報error: a is not defined
function f() 

f(); //error: a is not defined

思考:上面兩個例子都是在沒有賦值之前就呼叫了變數,為什麼區域性變數可以通過編譯,而全域性變數會報錯呢?

答:在預編譯期,解析器會對所有var 和 fuction 進行宣告,因為全域性變數沒有var,不能宣告所以會報錯。

注意:js的解析過程分為兩個階段:預編譯期(預處理)與執行期。

預編譯期:js會對本**塊中的所有var宣告的變數和function 宣告的函式進行處理,但需要注意的是此時處理函式的只是宣告式函式,而且變數也只是進行了宣告但未進行初始化以及賦值。

執行期:會按照**塊的順序逐行執行。。

思考題1:

函式內全域性賦值一次,var宣告一次 函式f()內還是會優先使用自己的變數a

var a = 1;                 

function f()

f(); //undefined 2 和 3

alert(a); //1

經典問題 思考題2:
var a, b;

(function() )();

alert(a); //undefined

alert(b); //3

IIFE為什麼不會汙染全域性變數

在開發過程中見到的iife,函式表示式都是匿名的,如果我們把它寫成命名函式表示式,那全域性作用域中豈不是多了乙個變數,這樣又怎麼能保證不會汙染全域性變數呢?通常我們在談論iife時,都是在談論它的用法,模組化,閉包等等,卻少有提及它為什麼可以拿來做模組化,為什麼不會汙染全域性變數。本文雖然是在說ii...

為什麼在js當中沒有var就是全域性變數

因為,在js中,如果某個變數沒有var宣告,會自動移到上一層作用域中去找這個變數的宣告語句,如果找到,就是用,如果沒找到,就繼續向上尋找,一直查詢到全域性作用域為止,如果全域性中仍然沒有這個變數的宣告語句,那麼自動在全域性作用域進行宣告,這個就 是js中的作用域鏈,也叫變數提公升 示例如下 var ...

設定全域性變數為什麼沒有成功!!!

問題描述 見 紅色部分 demo3 1.cpp demo of loading an icon and cursor resource includes define win32 lean and mean just say no to mfc include include all the win...