2017-05-30 18 views
1

我正在做一個簡單的JS樹庫,所以我可以動態地創建分層數據的標記。爲什麼我的構造函數的「this」變量保持私有?

問:爲什麼「var that = this;」當我使用Tree構造函數返回一個新的對象實例時,保持私有狀態?我很高興「這個」是私人的,但我不知道爲什麼它是私密的。思考?

function Tree(data, containerId) { 
    var that = this; // Private variable. Not returned by constructor, because... ??? 

    this.data = data; 
    this.container = document.getElementById(containerId); 
    this.selectedNodeId = null; 
    this.container.addEventListener('click', function (e) { 
     that.selectedNodeId = e.target.getAttribute('id'); 
     console.log(that.selectedNodeId); 
    }); 
} 
+1

我建議閱讀關閉。 ---爲什麼使用'that'而不是'this'? – evolutionxbox

+2

簡短的答案關閉。長的答案關閉。 – Darkrum

+1

您是否使用過'new'運算符的構造函數,例如:'new Tree()' – Slim

回答

1

看一下閉包,在Javascript函數中定義的任何東西都保留在那裏。有很大的資源負載,如https://github.com/getify/You-Dont-Know-JS

瓶蓋覆蓋深度:)

+0

你確定這個術語是正確的嗎?一個閉包關閉了自由變量 - 但是'this'在用'new'構造時不是一個自由變量。而'''只是一個局部範圍的'var'。 –

+0

你是對的; 「that」是一個私有變量,不是一個公共屬性(就像我以爲我是由於某種原因創建的)。如果我做了「this.that = this」之類的東西, (如果甚至編譯),那麼我會創建一個公共屬性,但這不是我正在做的。謝謝! –

+0

很高興我能幫忙:)我也不能推薦這本書系列了。 (我不是凱爾辛普森) – NewZeroRiot

1

new Tree(...)返回that(和this)的值。只需調用Tree(...)就不會。

如果沒有顯式返回,new運算符返回結果對象(即this)。只需調用該函數(在這種情況下)將返回undefined

+0

也許我們不在同一頁面上,但是做一些類似「var t = new Tree(...)」的東西不會讓「t.that」返回任何東西,但不確定。例如: –

+0

函數樹(data,containerId){ \t //私有「閉包」變量(變量是操作字,而不是「屬性」) \t var that = this; \t \t //公共屬性 \t this.data = data; \t this.container = document.getElementById(containerId); \t this.selectedNodeId = null; } // t =樹的新實例 var t = new Tree('some data here','111'); console.log('Iterate thru''s properties:');對於(p in t){ \t console.log(p); } console.log('t.that是t的公共屬性'+ t.hasOwnProperty('that')); //返回false。 –

+0

好的。誤解了你的問題...... – Ben

相關問題