2017-01-23 73 views
0

在我幼稚的概念,一個封閉僅僅是由另一個函數,它保留了外部函數的範圍內,返回後函數返回:創建封閉的條件是什麼?

var factory = function(y){ 
 
    var x = 2; 
 
    return function(){ 
 
     console.log(x+y); 
 
    } 
 
} 
 

 
var closure1 = factory(2); 
 
closure1(); // output 4 
 

 
var closure2 = factory(10); 
 
closure1(); // output 4 
 
closure2(); // output 12

雖然我不明白爲什麼加入循環中的事件處理程序將創建閉包? (如MDN所示)事件處理程序沒有明確返回,這不是此問題的關注點。


然後,我遇到了另一個page,並在約代碼片斷2:,故稱

的onclick功能將創建一個閉合,如果它引用在其範圍內的變量,但它沒有。

這是否意味着,在循環

nodes[i].onclick = function() { return false; };不是倒閉

但如果我把它改爲

nodes[i].onclick = function() { console.log(i); return false; };

然後它變成封閉?


結合部分的上方,我的概念來創建一個閉合是

  1. 它需要一個函數在另一個函數返回的,或其中連接在另一個函數的回調函數
  2. 內函數必須莫名其妙地訪問外部函數的範圍

是否真的,如果創建閉包iff 1 & 2滿意嗎?

回答

1

的封閉是簡單地通過另一功能的函數返回,這保留外功能的範圍內,返回

關閉之後。

它是一個函數,它在裏面創建的函數完成後仍然有指向它的引用。

返回它是保存對它的引用的一種方法。

雖然我不明白爲什麼在循環中添加事件處理程序會創建閉包?

該引用被傳遞給事件處理代碼。這在通過它的功能完成後保留它。


這是否意味着,在環...

是的,它的作用。


它需要在另一個函數返回的功能,或附着在另一個函數

號的參考可以去任何地方的回調函數,只要它被保留。

var obj = {}; 
 

 
function create() { 
 

 
    var foo = 1; 
 

 
    obj.bar = function() { 
 
    console.log(foo++); 
 
    }; 
 
} 
 

 
create(); 
 

 
obj.bar(); 
 
obj.bar(); 
 
obj.bar(); 
 
obj.bar();

內部功能必須以某種方式訪問​​外部函數的範圍