var a = 5 // 聲明一個全局變量
console.log(window.a) // 5
複製代碼
javaScript的全局變量的做用域,顧名思義做用域就是全局,而函數的參數跟局部變量的做用域在函數體內。java
若是兩個變量重名,一個變量是全局變量,一個是局部變量,優先級是 局部變量>全局變量bash
var a = 1 // 聲明全局變量
function fuc() {
var a = 2 // 局部變量
return a
}
console.log(fuc()) // 2複製代碼
若是在函數內聲明變量沒有帶var,會被看成全局變量,也叫隱式聲明函數
function fuc() {
var a = 2 // 局部變量
return a
}
console.log(a) // a is not defined複製代碼
function fuc() {
a = 2 // 沒有var,此時a是全局變量
return a
}
console.log(a) // 2複製代碼
javaScript變量的做用域,與java等語言不一樣的是,在變量聲明的代碼塊以外是不可見的,簡稱「塊級做用域」ui
function fuc(){
console.log(num) // 輸出未定義的變量 會報錯
}
fuc() // num is not defined複製代碼
function fuc(){
console.log(num) // 不報錯, 輸出undefined,由於num在函數體內有定義
var num = 5
console.log(num) // 5
}
fuc()
//因爲變量提高,上面代碼等價於
function fuc(){
var num
console.log(num) // undefined
num = 5
console.log(num) // 5
}
fuc()
複製代碼
javaScript的函數是容許嵌套的,就是在一個函數內部聲明另外一個函數,代碼以下spa
function A(){
var num = 5
function B() {
var b = 2
}
}
複製代碼
執行A函數的時候,會建立A函數的做用域,B函數在建立的時候會引用A的做用域code
執行B函數的時候會引用函數A的做用域,由所謂的函數做用域的嵌套造成了函數做用域鏈。cdn
在自身若是找不到該變量的時候,就會沿着做用域向上查找,直至在全局做用域找不到時拋出錯誤對象
var a = 10
function aaa () {
alert(a) // 調用順序3,內部沒有a變量,沿着做用域鏈向上尋找,在找到全局變量a =10
}
function bbb () {
var a = 20
aaa() // 調用順序2
}
bbb() // 調用順序1 結果爲10複製代碼
function aaa(){
var a=b=10
}
aaa()
alert(a) // 報錯
alert(b) // 10
//上面aaa()的代碼等價於下面
var b = 10
function aaa() {
var a = b
}複製代碼
function aaa () {
alert(a)
var a = 20
}
aaa() // undefined 此題與上面第二點的例子同樣複製代碼
var a = 10
function aaa () {
alert(a)
var a = 20
}
aaa() //結果爲:undefined
//此代碼等價於
var a = 10
function aaa () {
var a
alert(a) //undefined
a = 20
}
aaa() //結果爲:undefined複製代碼
var a = 10
function aaa (a) { // 函數傳入形參 a
alert(a)
var a = 20
}
aaa(a) // 結果爲: 10複製代碼
var a = 1
var a // 這裏的var a 是一個重複定義,變量只有定義後未賦值纔會輸出undefined,
這裏JS引擎對重複定義的規定是:以最近的變量賦值做爲變量在執行時的值
因此var a至關於無效
console.log(a) // 1
複製代碼
var a=[1,2,3]
var b = a
b.push(4)
alert(a) // 結果爲[1,2,3,4] 當b改變的時候a也發生了改變
當b從新被賦值的時候 a不會改變.示例:
var a = [1,2,3]
var b = a
b = [1,2,3,4]
alert(a) // 結果爲 [1,2,3]
複製代碼