2017-10-04 66 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

相关问题