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

 








 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM