2016-07-22 116 views
1

來自MDN,只是想知道爲什麼函數週圍的()函數,爲什麼在函數後面有extra(),爲什麼函數裏面的var b不會替換第一個var b的值,不使用關鍵字讓利,這將保持b局部的功能,由於基本javascript函數語法

var a = 1; 
var b = 2; 

(function() { 
    var b = 3; 
    a += b; 
})(); 

a; // 4 
b; // 2 
+0

搜索IIFE(立即調用函數表達式)。簡而言之,它調用一個沒有「污染」你的名字空間的函數。 – bomba6

+0

閱讀關於閉包 – cor

+0

'let'使變量本地保留* block *作用域。 'var'保存變量的局部函數作用域。 – Bergi

回答

0

當你寫變種b A函數裏,var關鍵字使它成爲一個局部變量。因此,函數內部的var b是局部變量,函數外部的頂部var b位於全局範圍內。您可以在MDN中閱讀更多關於範圍界定的內容。另外,函數後面的()被稱爲立即函數調用這意味着該函數在被定義後不久就被調用。此外,由於函數內部在聲明之前沒有var,因此它將採用全局a,它是1並且將局部變量b的值3加上3。

0

該功能只是立即調用。這就是最後一個括號。周圍的函數聲明額外的括號是因爲

function() { 
    var b = 3; 
    a += b; 
}(); 

將創建一個語法錯誤,因爲function關鍵字就不會在這裏解釋爲表達式。

,爲什麼函數內部的變種B不更換第一變種b的值,因爲它不使用關鍵字讓,這將保持b局部的功能,

您可能已經聽說let的特別之處在於它是區塊範圍。確實如此。但是var一直是該功能的作用域,並且由於第二個var b位於其自身的功能範圍內,因此它的作用域爲該功能,並且不會影響頂部範圍的b

0

模板

(function(){})(); 

是匿名函數的模板。
解釋它,讓我們創建一個功能x(),提醒「你好」:

function x() { 
    alert('hello'); 
} 

要調用x,我們將:

x(); 

現在,很明顯,如果我們將其替換對象的名稱它的價值,statememt將保持不變(例如var k = 5; alert(k); alert(5) - 兩個警報是相同的,因爲變量的名稱已被它的值取代)。

在我們的例子中,x的值是: function(){ alert('hello'); }

因此,如果我們用它代替x是在聲明中x();值 - >

(function() { 
    alert('hello'); 
})(); 

而這句法的來源。其結果將立即調用指定的函數。當然,這種語法也適用於帶有返回類型的參數和函數的函數。