一個考查做用域以及閉包的題目

var a = 2;
var func = (function(){閉包

var a = 3;
return function(){
    a++;
    console.log(a);
}

})();函數

func();
func();code

1.涉及的知識點:
(1)JS變量的做用域
(2)閉包
2.變量的做用域,通俗來講就是變量所能起到做用的範圍,也就是變量能被訪問到的範圍。
對於變量的做用域的理解,有一下幾點須要瞭解的:
(1)變量的做用域不是「塊級」,而是以「函數」爲做用域ip

這個所說的的「塊級」,指的是距離「代碼」最近的代碼塊。好比舉個C#的例子:
        public void Param()
        {
            var a = 1;
            if(a==1){
                var b = c;
            }
        }
 變量a的做用域就是 Param()這個代碼快,而變量b的做用域的做用域就是if所表示的代碼塊。
        
 來看個JavaScript的例子:
        function param () {
            {
                var a = "liyunhua"
            }
            console.log(a); // 輸出 liyunhua
        }
        console.log(a) // error
        
  變量a在params()中都是能夠被訪問的,而出了param()的範圍就會報錯。

(2)變量的覆蓋:「一個做用域中存在一個與外層做用域的同名變量,那麼在內部做用域以及其內部的全部的做用域中都訪問不到外面的變量」--摘自《深刻理解JavaScript》作用域

這句話仍是比較好理解的。這裏就不作解釋了。
    理解了上面的兩點,那麼在當即執行函數表達式(IIFE)中,a的初始值就是3,而且不會影響到外部做用域變量a的值。執行函數(IIFE)中,a的初始值就是3,而且不會影響到外部做用域變量a的值。
3.閉包
  閉包的東西太多,這裏就以題論題,不會過多地講述閉包的知識點。有興趣的朋友,能夠去這個連接瞭解 
 (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures)。
  這裏說閉包的一個做用:使函數能夠維持其建立時所在做用域。
  怎麼理解這句話呢?
      也就是說一個函數離開了「建立時的做用域」,可是其仍是會和這個做用域以及這個函數外部的做用域相關聯,也就是說「變量」依舊是那個「變量」
  以這個題目爲參照,那麼結果就很明瞭了。
相關文章
相關標籤/搜索