聲明
和調用
。function makeCounter() { // 只能在makeCounter內部訪問i var i = 0; return function () { console.log(++i); }; } // 注意,counter和counter2是不一樣的實例,分別有本身範圍內的i。 var counter = makeCounter(); counter(); // logs: 1 counter(); // logs: 2 var counter2 = makeCounter(); counter2(); // logs: 1 counter2(); // logs: 2
聲明瞭makeCounter函數
,該函數中定義了局部變量i
,返回值是一個函數
,這裏要注意的是一個函數的聲明
;表達式的方式
建立實例,將makeCounter函數的執行結果
賦給變量counter
,此時counter獲得的是makeCounter的返回值
,即function () {console.log(++i);}
;counter()
表達式中,()
的做用就是用於執行function () {console.log(++i);}
,在控制檯中打印出結果。counter
是一個標識符
,就是屬於原始表達式;function(){}
只是一個函數聲明,不屬於表達式,所以,在其後面加上()
,並非當即調用函數表達式;function fn(){}
,即便在後面加上()
,也沒法實現當即執行效果,它一樣只是一個函數聲明,不屬於表達式
。var counter2 = makeCounter();
在標識符counter2後面加上()
,纔是對其進行調用。把函數聲明變爲表達式
,如何轉換呢?// 下面2個括弧()都會當即執行 (function () { /* code */ } ()); // 推薦使用這個 (function () { /* code */ })(); // 可是這個也是能夠用的
小括號()
的做用,()
除了做爲分組運算符應用於數學運算外,在js中,它還有個重要的做用,就是用於區分一個代碼是函數聲明仍是函數表達式
,見下面代碼:function func(){};//函數聲明方式 (function func(){})//函數表達式方式
結合這段代碼和上面的代碼,咱們就能夠清楚的看出,()在代碼中的做用,就是將函數聲明轉換爲函數表達式
,這就解答了咱們上述5中的問題。javascript
eval()
方法的使用。該方法的一個經常使用的應用場景,就是使用eval()函數將json格式字符串轉換爲對象
的時候,須要多嵌套一層小括號。