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);