來自MDN,只是想知道爲什麼函數週圍的()函數,爲什麼在函數後面有extra(),爲什麼函數裏面的var b不會替換第一個var b的值,不使用關鍵字讓利,這將保持b局部的功能,由於基本javascript函數語法
var a = 1;
var b = 2;
(function() {
var b = 3;
a += b;
})();
a; // 4
b; // 2
來自MDN,只是想知道爲什麼函數週圍的()函數,爲什麼在函數後面有extra(),爲什麼函數裏面的var b不會替換第一個var b的值,不使用關鍵字讓利,這將保持b局部的功能,由於基本javascript函數語法
var a = 1;
var b = 2;
(function() {
var b = 3;
a += b;
})();
a; // 4
b; // 2
當你寫變種b A函數裏,var關鍵字使它成爲一個局部變量。因此,函數內部的var b是局部變量,函數外部的頂部var b位於全局範圍內。您可以在MDN中閱讀更多關於範圍界定的內容。另外,函數後面的()被稱爲立即函數調用這意味着該函數在被定義後不久就被調用。此外,由於函數內部在聲明之前沒有var,因此它將採用全局a,它是1並且將局部變量b的值3加上3。
該功能只是立即調用。這就是最後一個括號。周圍的函數聲明額外的括號是因爲
function() {
var b = 3;
a += b;
}();
將創建一個語法錯誤,因爲function
關鍵字就不會在這裏解釋爲表達式。
,爲什麼函數內部的變種B不更換第一變種b的值,因爲它不使用關鍵字讓,這將保持b局部的功能,
您可能已經聽說let
的特別之處在於它是區塊範圍。確實如此。但是var
一直是該功能的作用域,並且由於第二個var b
位於其自身的功能範圍內,因此它的作用域爲該功能,並且不會影響頂部範圍的b
。
模板
(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');
})();
而這句法的來源。其結果將立即調用指定的函數。當然,這種語法也適用於帶有返回類型的參數和函數的函數。
搜索IIFE(立即調用函數表達式)。簡而言之,它調用一個沒有「污染」你的名字空間的函數。 – bomba6
閱讀關於閉包 – cor
'let'使變量本地保留* block *作用域。 'var'保存變量的局部函數作用域。 – Bergi