试图更好地理解 "variable shadowing"

Trying to understand better "variable shadowing"

我知道这是一个问题,当你在函数(局部变量)中有一个像原语一样的全局变量时。全局变量不会被局部变量覆盖。 喜欢:

let a = 10;
function increase1(a){ 
a++; }
increase1(a);
console.log('a = ',a);

所以这是行不通的。它给了我们 a = 10 下面的代码有效,它给了我们 a = 11:

let a = 10;
function increase2(){
a++;}
increase2(a);
console.log('a = ',a);

因为它与:

let a = 10;
a++;
console.log('a = ',a);

但为什么这与 increase1 的行为方式相同?

let a = 10;
function increase3(x){ 
x++; }
increase3(a);
console.log('a = ',a);

为什么当我尝试这个时,我得到“undefined”?

console.log('a = ',increase3(a));

谢谢。

案例 1: 这将 运行 并给出值 10,如您所知,值在函数内部更改(除了 object/array 不会持续存在) - 因为这些是按值调用而不是引用。

let a = 10;
function increase1(a){ 
a++; }
increase1(a);
console.log('a = ',a);

Case-2: 这会出错,因为你没有定义 a。你得到 bluff/mirage 值增加了,因为你对控制台使用相同的 window,而 a 的值来自 chrome-tab 的缓存。它应该会报错。

function increase2(){
a++;}
increase2(a);
console.log('a = ',a);

Case-3: 这也会报错。只是在使用值进行测试时不要使用相同的 chrome-tab-console。试穿一个新的。您还没有定义 a,那么您希望该值如何增加?

function increase3(x){ 
x++; }
increase3(a);
console.log('a = ',a);

首先,您需要了解这里有 2 个范围,一个是全局的,另一个是功能性的。 将作用域想象成一个对象,其中定义的每个变量都附加为 属性。这里函数作用域嵌套在 global.

现在变量查找从 运行 scope(context) 开始。如果那里不存在变量,它将继续查看外部范围(而不是内部范围),直到找到变量或到达全局范围

现在 案例 1:

let a = 10;             //[[globalScope]] = {a: 10}
function increase1(a){  //[[increase1Scope]] = {a : 10} as parameters are local variable to function
a++; }                  //[[increase1Scope]] = {a: 11}
increase1(a);           //here u have passed 10 as a **value**  to increase1 param a(you havent passed global variable **"a"**  but its value)
console.log('a = ',a);  //takes value from its running scope i.e [[globalScope]] which is 10

案例2:

let a = 10;            //[[globalScope]] = {a: 10}
function increase2(){  //no parameters so [[increase2Scope]] = {}
a++;}                  //[[increase2Scope]] don't have a, so look into next outerscope i.e. [[globalScope]] and alter its value to [[globalScope]] = {a: 11}
increase2(a);         //as increase2() has no defined parameter so this argument of 10 wont do anything
console.log('a = ',a); //same from [[globalScope]] = {a: 11}

案例 3:

let a = 10;             //[[globalScope]] = {a: 10}
function increase3(x){  //[[increase1Scope]] = {x: 10}
x++; }                  //[[increase1Scope]] = {x: 11}
increase3(a);           //value 10 get passed to increase3 -> x
console.log('a = ',a);  //this time [[globalScope]] = {a: 10}, so 10

现在,由于 increase3() 函数没有 returning 任何东西,所以你变得未定义

console.log('a = ',increase3(a));  //undefined

要获得所需的结果,请在函数定义中包含一个 return 语句:

function increase3(x){  
  x++; 
  return x;
} 

希望对您有所帮助。我试图正确看待某些事情。 我强烈建议你阅读下面的在线 JS 书。一定会有帮助。

https://javascript.info/closure