當我們定義乙個變數並給他賦值時var a = 1;
其實js引擎分開了兩步來執行:1.var a
宣告這個變數,並將它放到當前作用域中去 2.a = 1
在作用域中找到變數a然後將其賦值1
函式亦是如此:當我們宣告乙個函式時function fn(){}
js引擎同樣將其分開了兩步來執行:1.function fn()
function相當於var,將fn加入到當前作用域中,並且值為函式體
**注:**函式宣告分兩種:1.function fn(){}
這種叫函式宣告,當將fn加入到作用域中時它的值就直接是函式體了不經過undefined 2.var fn = function (){}
這種叫函式表示式,它的執行過程是先在作用域中新增fn變數此時的值為初始值undefined,然後當執行到這一行時才將函式體賦值給fn
當我們執行乙個函式時會產生乙個ao(函式作用域)
預設有乙個go(全域性作用域)
根據上圖我們模擬以下程式:
var name =
'luopo'
;var age =18;
functionfn(
)fn()
函式fn外面的變數的作用域就是我們的全域性作用域函式裡面的變數的作用域就是我們的函式作用域接下來我們看**:
在全域性作用域中我們擁有兩個變數和值分別是:
name : 『luopo』
age : 18
在函式fn的函式作用域中我們擁有乙個變數和值分別是:
name : 『daniu』
執行到console.log(name, age)
時:
我們的js引擎就會找到作用域哥們們,首先找自己這個函式的作用域哥們,
於是我們的js引擎就拿到了name的值為』daniu』
所以程式的執行結果為:'daniu'18
函式作用域相當於全域性作用域的兒子,兒子可以拿爸爸的東西,而爸爸不能拿兒子的東西,如果爸爸也都沒有的話在「非嚴格模式」下會讓爸爸新增乙個這個新變數值為初始值undefined,如果在「嚴格模式」下則會丟擲異常referenceerror: xx變數 is not defined
,爸爸沒有的話則直接丟擲這個異常。
JS之作用域精解
一。執行期上下文 當函式執行時,會建立乙個成為執行期上下文的內部物件。乙個執行期上下文定義了乙個函式執行時的環境,函式每次執行時對應的執行期上下文都是獨一無二的,所以多次呼叫乙個函式會建立多個執行期上下文。每當函式執行完畢,它所產生的執行期上下文被銷毀。即 函式執行時才會產生自己的ao,執行結束後立...
作用域 作用域鏈 精解
物件有屬性有方法 一切有物件的東西都有屬性 物件導向就是基於此了解物件導向 在函式方法上有乙個隱性屬性 scope 作用域 其中儲存了執行期上下文的集合也就是預編譯時所產生的 稱為執行期上下文的內部物件ao 在函式執行的前一刻會進行預編譯 生成ao物件 什麼是預編譯 函式每次執行時所生成的執行期上下...
JS作用域和作用域鏈
什麼是js作用域?js作用域也就是js識別變數的範圍 1 全域性作用域 2 區域性作用域 3 e6的塊級作用域 全域性作用域 也就是定義在window下的變數範圍,在任何地方都可以訪問 區域性作用域 是只在函式內部定義的變數範圍 塊級作用域 簡單來說就是用let和const在任意的 塊中定義的變數都...