2017-05-30 57 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

相关问题