2013-07-21 22 views
1

我已經讀了很多例子,問題在封左右的計算器,但我覺得我不能完全理解它,這裏是我得到的:我對閉包的理解是否錯誤?

function testClosure (s1,s2){ 
    return function(s3){ 
     return s1 +' '+ s2 +' '+s3; 
    } 
} 

var t1 = testClosure("test","test2"); 


console.log(t1("test3")); //test test2 test3 
  1. T1是持有功能和範圍鏈testClosure();
  2. t1本身是返回匿名函數。
  3. 當t1被調用時,它將通過testClosure();的內部函數接受最後一個參數。
  4. s1,s2,s3通過作用域鏈查找並返回。

我理解錯了嗎?

+0

你試過了嗎? –

+1

#2聽起來不對 - t1不返回函數,t1是一個匿名函數,它在調用時返回一個字符串。 – goat

+0

@Ed治癒對不起,但你是什麼意思? – enix

回答

2
  1. 您執行testClosure
  2. testClosure創建並返回一個新函數。由於該函數是在另一個函數內部創建的,因此會創建一個閉包並將其添加到新函數的作用域鏈中。閉包有權訪問在創建時傳入testClosure的參數。
  3. 變量t1被分配返回的函數作爲其值。
  4. 您致電t1並傳遞參數。在t1的內部,您引用了作爲閉包一部分的參數。
  5. t1無法在當前上下文中找到這些值,因此它會查看作用域鏈中的下一個作用域,即關閉作用域。
  6. t1找到值並完成執行。
+0

't1' *是*關閉 – newacct

+0

@newacct我認爲你是正確的。返回的函數實際上是一個函數加上可用於閉包的變量。當執行t1時,其作用域鏈如下所示:'[Activation Object Closure(s1,s2),Activation Object Global(window,etc)]'。由於賦給't1'的函數包含閉包的激活上下文作爲其作用域鏈的一部分,所以可以調用't1'作爲閉包。 – Zenwolf

+1

't1'是一個閉包,因爲它是一個函數,它引用函數外部的變量('s1'和's2')。另一方面,你可以說'testClosure'不是一個閉包,因爲它沒有引用任何外部的變量。當't1'被執行時,你有它的內部作用域,而它的父對象是'test'的函數的執行範圍,其中't1'被創建,然後上面是' testClosure'。 – newacct

0
  1. testClosure被調用名爲函數接受兩個參數,並返回一個匿名函數,並設置T1是一個匿名函數。

t1現在是一個匿名函數,可以調用並接受一個參數。當調用t1時,它將從名稱函數和匿名函數構建您的字符串參數參數並返回結果。

當您調用命名函數testClosure時,它會創建一個閉包。當您調用匿名函數時,它可以訪問所附的名稱函數字符串params,並將所有3個參數作爲內置字符串返回。


JS中的閉包是JavaScript提供的最強大的實現之一。學習如何以及在何處實施或需要關閉的位置是通過一段時間的嬰兒步驟學習的。

你的JavaScript庫越大,你會發現自己需要關閉的越多。

閉包允許您將某個特定的數據放到其他上下文無法訪問的上下文中,並且我發現自己在其他環境中使用它們的次數更多。

匿名函數和閉包大部分時間都在一起工作。學習閉包的最好方法是保持每天關於閉包的一點一滴學習,當時間到了,當你發現自己處於需要閉包的情況時,你會最終得到它。

下面是一個例子,我正在對遠程服務器上的相冊進行AJAX調用。 AJAX調用的成功功能包含專輯的一組照片。對於每個循環,我調用一個名稱函數,它將返回一個匿名函數。匿名函數被設置爲按鈕單擊事件。

每個添加到DOM的新按鈕都可以訪問它自己的封閉網址字符串參數。

學習和理解閉包是一個好的JavaScript程序員至關重要。

function testClosure(url) { 

    return function (ev) { 

     document.getElementById('myImg').url = url || 'http://www.dummyurl/dummy.png'; 
    } 
} 

$.ajax({ 
    type: "post", 
    url: "http://www.myurl.com", 
    data: 'photoalbum' = 45, 
    dataType: "json", 
    success: function (photos) { 

     for (var i = 0; i < photos.length; i++) { 

      var btn = document.createElement('input'); 
      btn.type = 'button'; 
      btn.onclick = testClosure(photos[i].url); 

      document.body.appendChild(btn); 

     }; 
    } 
}); 
+0

感謝您的解釋和建議,我很感激。 – enix

相關問題