JS-做用域

全局變量,我的理解全局變量就是全局對象window的屬性

var a = 5  // 聲明一個全局變量
console.log(window.a) // 5
複製代碼

1.變量做用域

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複製代碼

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() 
複製代碼

3.做用域鏈

javaScript的函數是容許嵌套的,就是在一個函數內部聲明另外一個函數,代碼以下spa

function A(){
    var num = 5
    function B() {
        var b = 2
    }
}
複製代碼

執行A函數的時候,會建立A函數的做用域,B函數在建立的時候會引用A的做用域code


執行B函數的時候會引用函數A的做用域,由所謂的函數做用域的嵌套造成了函數做用域鏈。cdn

在自身若是找不到該變量的時候,就會沿着做用域向上查找,直至在全局做用域找不到時拋出錯誤對象

做用域題目

  • js內部做用域能夠訪問外部,但外部不能訪問內部

var a = 10
function aaa () { 
 alert(a)  // 調用順序3,內部沒有a變量,沿着做用域鏈向上尋找,在找到全局變量a =10
} 
function bbb () {
    var a = 20
    aaa()  // 調用順序2
} 
bbb()  // 調用順序1  結果爲10複製代碼
  • 不用var定義變量,會默認爲全局變量

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]
複製代碼
相關文章
相關標籤/搜索