2017-09-17 16 views
0

我創建了一個簡單的模塊模式函數,它返回一個方法對象,在這種情況下,只有一個方法添加一個創建具有唯一ID的div,然後將其添加到特定的段元素。該id是由名爲cardId的函數中的私有變量創建的。我不理解變量是不是重置爲每個函數調用返回1,而是從函數返回的每個div都有一個唯一的ID,這意味着有一個變量關聯另一個變量名爲cardId。有人可以解釋一下這個問題,或者指出一件事情嗎?這個變量在每次函數調用時不會被重置到什麼程度?

let cardTools= function(){ 
    let cardId=1; 

    return { 
     addCard: function(){ 
     let card=document.createElement("div"); 
     let sec=document.getElementsByClassName("memory-cards")[0];//gets a section 

     card.classList.add("card"); 
     card.id="i"; 
     card.id+=cardId; 
     cardId+=1; 

     sec.appendChild(card); 

     return card; 
     } 
    } 
} 

let tools= cardTools(); 

let card=tools.addCard(); //id==i1 
let card2=tools.addCard(); //id==i2 
let card3=tools.addCard(); //id==i3 
+0

所以你說這是工作,但你不明白? – Prisoner

+1

好'cardId'在函數'addCard'之外。它被困在一個閉包中(由函數cardTools構成),但它並沒有在addCard中聲明,所以每次調用它時都不會被重新聲明。 –

+0

簡單檢查。多少次你叫'cardTools'?一旦。所以,應該執行多少次'let cardId = 1' ... –

回答

0

首先,我要問你一個問題。你確定這段代碼正在工作嗎?我不得不做下面的工作。

let card1 = cardTools().addCard(); 
console.log(card1.id); 

當我這樣做時,我在每次通話中都能看到i1。你在這裏發佈的代碼片段給了我語法錯誤。

更新: 對不起,我沒有正確讀取您的代碼。我很確定你的代碼正在工作。但是,當我這樣做時,我得到了每種情況下的i1

+0

執行時必然會有一些錯誤。由於'cardId'是在addCard()'之外聲明的,因此不會創建'cardtools()'的新對象。所以'cardId'的範圍將被保留。所以我建議你再次檢查執行。 –

相關問題