2017-04-14 69 views
-2

我正在閱讀一些代碼,並遇到此問題。爲什麼變量等於一個返回函數的匿名函數?

var myvar = (function(){ 
    return function() { 
    // code here 
    } 
})(); 

我有點困惑,爲什麼它是這樣寫的。它似乎被命名,匿名和自我執行。這怎麼能寫得更乾淨?

+0

變量'myvar'結束爲從外部函數返回的那個函數的引用。這是一個常見的成語。外部函數可以聲明和初始化返回函數使用的變量。 – Pointy

+0

看看http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – Derek

回答

1

在Javascript中,var是函數作用域或全局作用域。有時你需要塊範圍。在ES6之前,function(){}()是模擬塊範圍的唯一方法。 (ES6介紹letconst。)

例如,

var callbacks = []; 
for (var i = 0; i < 10; i++) { 
    var callback = (function() { 
    var index = i; 
    return function() { 
     console.log('i = ' + i); 
     console.log('index = ' + index); 
    }; 
    })(); 
    callbacks.push(callback); 
} 

隨着function(){}()包裝,所有的回調有自己index變量。 i在包裝外部並且被共享。如果我們要調用callbacks[5](),它會記錄

i = 10 
index = 5 

function(){}()結構有時被稱爲「立即調用的函數表達式」,或「IIFE」的簡稱。