2014-03-01 60 views
0

尽管我对此进行了大量的阅读(同样在网站中),但我仍对这部分封闭感到困惑。 接过代码从这里: http://www.crockford.com/javascript/private.htmlJavaScript函数成员差异

So what is the different between this: 
function Container(param) { 
    this.member = param; 
} 
...And this - 
function Container(param) { 
    var member = param; 
    // and also in case it's without "var", I.e. global 
} 

请解释一下,当你创建了每种情况的OBJ会发生什么 -

var myContainer = new Container('abc'); 

而且 - 什么是从参数访问差异物体?你可以举一个例子作为参数返回函数吗?

非常感谢!

+0

你知道'var b'做什么吗?它只是创建一个局部变量'b'。在另一边的'a.b = ..'为物体'a'赋予一个属性'b'。两件完全不同的事情。 –

回答

0

这是我的观点: 当您使用新创建通过函数的对象,通过VAR变量初始是局部变量:

function Test(){ 
    var name = "John"; 
    this.getName = function(){ 
     return name; 
    } 
} 
var obj1 = new Test(); 
console.log(obj1.name); //undefined 
console.log(obj1.getName()); //John 

这意味着你不能直接读取变量外函数。这就像Java或C++中的私有变量;

但是当你使用this.name =“约翰”,这是一种不同的情况:

function Test2(){ 
    this.name = "John"; 
} 
var obj2 = new Test2(); 
console.log(obj2.name) //"John" 

您可以直接读取变量,这就像“大众”在Java或C++变量。

希望这可以为你工作。 :)

+0

非常感谢!它非常有帮助:) 你能否告诉我它是如何与原型一起工作的? (例如,安全访问名称和不安全访问) – FED

+0

对不起,我的回答在这种评论模式下似乎太长。所以我只是在应答模式下回答。 :) –

0

在函数Test中,当我们用new Test声明变量obj1时。它通过被称为“测试”的构造函数创建。

这个过程就像我们以正常的方式调用一个函数。当然,这是一个局部变量“名称”。当我们删除一个名为“this.getName”的函数表达式时,这只是表示函数“Test”的一个表达式。

但是当我们调用“new Test”时,它返回一个有键值调用“getName:function {}”的对象。当我们调用“obj1.getName”时,它会返回变量“name”。但是它找不到getName的局部变量“name”,因此它会搜索其父级的范围,以查找是否存在变量“name”,它不会停止,直到我们获得它或仅返回“undefined”。这使得“引号”在内存中保留变量“名称”,但我们可以通过函数“getName”来获取它。

对于所有这些,我们在函数“Test”中创建一个私有变量。 :)希望这可以帮助。