js函数作用域
1 //变量提前 并不是赋值提前,变量a提前此时a的值为undefined,而同名的函数提前,将会覆盖变量a,使a的值为函数。 2 var a; 3 a=()=>{ 4 console.log(11) 5 }; 6 console.log(a);
1 // 改变变量a的声明位置,结果依然一样。究其原因:变量提升,并不包含变量复制的提升。 2 a=()=>{}; 3 var a; 4 console.log(a);//a的值依然是函数。
也可以这么认为在声明变量和显示声明函数的时候,函数的值会覆盖变量。
对于变量覆盖:只是针对重新声明变量。
- 同一个作用域中,会进行值得覆盖,函数覆盖变量;变量覆盖变量;函数覆盖函数。
- 不同作用域,不会出现覆盖情况。
1 var k; 2 var k=2; 3 console.log(k); 4 m=()=>{console.log(131231)}; 5 var m; 6 console.log(m); 7 n=()=>{console.log(1)}; 8 n=()=>{console.log(2)}; 9 console.log(n);
1 //如果进行覆盖,不可以重新声明变量,直接调用改变。 2 var cl1=22; 3 dd1=()=>{ 4 cl1=33; 5 }; 6 dd1(); 7 console.log(cl1);
如果在声明变量不加var,他会从当前域中是否存在该变量,如果没有,继续去上一层作用域查找,如果有就覆盖,如果没有继续查找,直到查找到顶层作用域。最后没有的话。会将该变量挂载在window对象中作为属性或者方法。作为全局变量,我们可以直接调用也可以直接使用window.变量名字
1 /** 2 * 如果在声明变量不加var,他会从当前域中是否存在该变量,如果没有,继续去上一层作用域查找,如果有就覆盖,如果没有继续查找,直到查找到 3 * 顶层作用域。最后没有的话。会将该变量挂载在window对象中。 4 */ 5 fn=()=>{ 6 a=2; 7 }; 8 fn(); 9 console.log(window.a)
关于函数中形参,相当于在函数局部作用域中声明一个变量 var 变量名。并不会覆盖不同作用域的同名标识符。
1 /** 2 * 关于函数中形参,相当于在函数局部作用域中声明一个变量 var 变量名。并不会覆盖不同作用域的同名标识符。 3 */ 4 var cc; 5 cc=123; 6 cc1=(cc)=>{//相当于重新声明一个变量在函数局部作用域。var cc; 7 cc=2123;//对于形参cc重新赋值。arguments[0]=2123一样的效果。 8 console.log(cc); 9 }; 10 cc1(cc);//注意在调用函数进行传参的时候传递的是值。对于基本类型传递的是数值。而对于对象传递是内存地址不是引用。 11 console.log(cc);
学习是一种态度,坚持是质变的利器!