學習湯姆大叔《深刻理解JavaScript系列》有感(1) —— 當即調用的函數表達式

一. 下面代碼用於理解函數的聲明調用

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
  1. 首先聲明瞭makeCounter函數,該函數中定義了局部變量i,返回值是一個函數,這裏要注意的是一個函數的聲明;
  2. 使用表達式的方式建立實例,將makeCounter函數的執行結果賦給變量counter,此時counter獲得的是makeCounter的返回值,即function () {console.log(++i);};
  3. 所以,counter()表達式中,()的做用就是用於執行function () {console.log(++i);},在控制檯中打印出結果。

二. 經過上面的例子,咱們有必要認識一下js表達式,用於幫咱們理解了當即調用的函數表達式

  1. 表達式分爲原始表達式和複雜表達式,上述counter是一個標識符,就是屬於原始表達式;
  2. function(){}只是一個函數聲明,不屬於表達式,所以,在其後面加上(),並非當即調用函數表達式;
  3. 儘管是命名函數也好,如function fn(){},即便在後面加上(),也沒法實現當即執行效果,它一樣只是一個函數聲明,不屬於表達式
  4. 只有把它賦給一個變量,var counter2 = makeCounter();在標識符counter2後面加上(),纔是對其進行調用。
  5. 所以,如今的方法就是把函數聲明變爲表達式,如何轉換呢?

三. 書寫當即調用的函數表達式的方法,見下面代碼:

// 下面2個括弧()都會當即執行
(function () { /* code */ } ()); // 推薦使用這個
(function () { /* code */ })(); // 可是這個也是能夠用的
  1. 首先,咱們來理解一下小括號()的做用,()除了做爲分組運算符應用於數學運算外,在js中,它還有個重要的做用,就是用於區分一個代碼是函數聲明仍是函數表達式,見下面代碼:
function func(){};//函數聲明方式
(function func(){})//函數表達式方式

結合這段代碼和上面的代碼,咱們就能夠清楚的看出,()在代碼中的做用,就是將函數聲明轉換爲函數表達式,這就解答了咱們上述5中的問題。javascript

  1. 咱們也能夠經過一個其它的例子來加深理解,這就是eval()方法的使用。該方法的一個經常使用的應用場景,就是使用eval()函數將json格式字符串轉換爲對象的時候,須要多嵌套一層小括號。
相關文章
相關標籤/搜索