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的值依然是函數。

 

也能夠這麼認爲在聲明變量和顯示聲明函數的時候,函數的值會覆蓋變量。函數

對於變量覆蓋:只是針對從新聲明變量。spa

  • 同一個做用域中,會進行值得覆蓋,函數覆蓋變量;變量覆蓋變量;函數覆蓋函數。
  • 不一樣做用域,不會出現覆蓋狀況。
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);
相關文章
相關標籤/搜索