首先我們來看一段**,然後通過分析這段**來說明作用域鏈的這個問題,**如下:
console.log(total);
var total=0;
function fn(num1,num2)
fn(100,200)
console.log(total);
複製**
這段**輸出的結果為:
undefined
undefined
3000
window作用域下的執行順序,如下圖:
1 如何區分私有的和全域性的?
第一:在全域性作用域下宣告(預解析)的變數是全域性變數。
第二:在私有作用域中生成的變數和函式的形參都是私有變數。
第三:如果在私有作用域中遇到乙個變數,如果能判斷是私有變數,那麼它與外界的任何內容都沒有關係。如果不是私有變數,那麼則往當前作用域的上一級進行查詢,如果上級也沒有,一直往上查詢,直到window。(其實這個就是作用域鏈)
複製**
2 函式的私有作用域的執行順序
當函式在執行的時,執行的是函式體內的內容,所以函式首先會形成乙個新的私有的作用域。
第一步:函式的有形參,那麼就先給形參賦值
第二步:進行私有域中的預解釋
第三步:私有域中的**從上到下的執行
如下圖是:函式體執行的順序:
複製**
函式形成乙個新的作用域,用來保護裡面的私有變數,不受到外界變數的影響,同時也不影響外界變數,這種情況我們叫「閉包」
作用域的預解析對於var變數只是定義但是不會賦值,賦值是在執行的時候進行賦值的
函式裡面判斷是否是私有的變數,就看是否是形參和前面是否有var宣告符號
JavaScript 作用域,作用域鏈詳解
前言 es5缺少區域性作用域的概念,而es6已經補充了es6的概念。一 作用域 把作用域比作乙個個封閉的方塊,在相同乙個封閉方塊中的物體可以相互接觸,但是無法和別的封閉方塊中的物體直接接觸。二 全域性作用域 這個就是簡單的全域性作用域。全域性作用域相當於乙個最大的封閉空間,他裡面還有乙個個小的封閉空...
Javascript的作用域域作用域鏈的理解
如何解析一段可執行 分了兩個階段 解析 和執行 其中解析 可以理解為記名字,就是先把關鍵字var和function定義的變數名登記了下來,這也就有了變數提公升這一說。在執行 階段才是真正的執行賦值,運算等操作。暫不解析這幾個名詞,先來看乙個例子。var scope global function f...
07 javascript作用域與作用域鏈
理解 就是一塊 地盤 乙個 段所在的區域 它是靜態的 相對於上下文物件 在編寫 時就確定了 分類全域性作用域 函式作用域 沒有塊作用域 es6有了 作用 隔離變數,不同作用域下同名變數不會有衝突 es5 沒塊作用域 if true console.log c 3 var a 10,b 20 func...