2017-10-04 60 views
0

我覺得我幾乎可以抓住它......喜歡它直覺上有道理,但我不知道爲什麼細節。有人可以解釋:爲什麼全局變量不受使用相同變量名稱的函數影響?

爲什麼在這裏,全球ARR不受影響功能

arr = [1,2,3] 
function test(arr, a, b) { 
    arr = arr.filter(item => (a < item && item < b)) 
    console.log(arr) // [2] 
} 

test(1, 3) 
console.log(arr) // [1,2,3] 

爲什麼在這裏,全球ARR受影響的功能

arr = [1,2,3] 
function test(a, b) { 
    arr = arr.filter(item => (a < item && item < b)) 
    console.log(arr) // [2] 
} 

test(1, 3) 
console.log(arr) // [2] 

編輯另一個外線外例。這裏爲什麼全球ARR受影響的功能之外,即使再次ARR作爲參數

arr = [1,2,3] 
function test(arr, a, b) { 
    for (let i = 0; i < arr.length; i++) { 
    let val = arr[i]; 
    if (a >= val || val >= b) { 
     arr.splice(i, 1); 
     i--; 
    } 
    } 
    console.log(arr) // [2] 
} 
console.log(arr) // [2] 
+0

可能的重複:[JavaScript中變量的範圍是什麼?](https://stackoverflow.com/q/500431/8173752) –

+0

您需要重寫您的問題,因爲您的代碼根本無法工作。您正在嘗試在數字上使用過濾器方法。 – zfrisch

回答

0

第一個函數聲明arr作爲參數傳遞。

函數內部,arr指的是參數,而不是全局變量。

這被稱爲範圍。

+0

這是超級有用的,但它導致了我第三種情況,其中'arr'被聲明爲一個參數,但全局變量仍然受到影響......你能快速查看嗎? – james

+0

@james:現在你正在改變對象,而不是設置一個變量。 – SLaks

+0

嗯,我想混亂是,我沒有'arr ='在函數中,所以這是真的,我沒有設置變量,但根據以前的邏輯,它似乎是我突變傳遞的參數,與全局變量?那是不對的? – james

相關問題