今天,我們來初步了解一下作用域和閉包的相關知識點,因為是初步了解,所有不會深入,不會太難,希望對大家有所幫助。
作用域是什么?
說白了,作用域就是一個代碼區域,或者也可以理解成為一個運行環境。
JS中有兩種作用域,全局作用域和函數作用域。
// window環境 var a = 123; var b = 234; var c = 456; //函數作用域 function A(){ var a = 123; var b = 234; var c = 456; } A();
全局作用域:直接在腳本中寫代碼,在全局作用域中聲明得變量,會提升到腳本頂部,并成為window屬性。(前幾節中有涉及)
函數作用域:在函數中書寫代碼,聲明的變量會提升到函數的頂部,不會成為全局屬性,在函數內部聲明的變量不會污染全局變量。
因此,在編程過程中,盡可能的將功能封裝在函數中。
立即執行函數(IIFE)
當函數成為一個表達式的時候,既不會提升,也不會污染全局變量。
將函數變成表達式的方法之一,就是用小括號就函數包裹起來。代碼如下:
( function 函數名(){ 函數體; })
如此一來,這樣的函數就無法通過函數名來調用了。
如果,函數作為表達式并且立即調用,這樣的函數就被成為立即實行函數:
( function 函數名(){ 函數體; })(); ( function 函數名(){ 函數體; }());
調用的小括號可以在里也可以在外。
由于大部分情況下,函數的函數名不起作用,因此,立即執行函數一般不書寫函數名,沒有函數名的函數,稱之為匿名函數。
作用中可以使用的變量
在全局作用域下只能使用全局作用中聲明的變量(包括函數)。
在函數作用域下,既可以使用函數作用域中聲明的變量,也可以使用外部環境中聲明的變量(包括函數)。
var a = 123; console.log(a);打印出來123 function A(){ console.log(a);//也可以打印出來123; var b = 234; } A(); console.log(b);//這里會報錯,因為b未定義。
內部變量和外部變量沖突的時候,使用內部變量,在內部沒有的情況下,依次向外層環境中找。
內部可以使用外部,但外部不可能使用內部的(你的就是我的,我的還是我的)。
初探閉包
從嚴格意義上來講,閉包是一種現象。
閉包就是內部函數可以使用外部函數環境中的變量。
天就講到這里,關于閉包的知識,后期會進行詳細的解說。