var name = new object()vs this.name = new object

时间:2012-07-25 03:48:43

标签: javascript oop

在这种情况下,我定义了一个名为DropHandler

的对象
function DropHandler(){}
DropHandler.prototype={
    AllowDrop : AllowDrop,
    Drag : Drag,
    Drop : Drop
}

想在Admin对象中创建一个DropHandler实例。但是下面的代码有什么不同?似乎代码(2)在这种情况下不能使用,它会得到一个未定义的类型错误

var BackendAdmin = function(){
    this.DropHandler = new DropHandler();//(1);
    var DropHandler = new DropHandler();//(2);
}

2 个答案:

答案 0 :(得分:3)

区别在于:(1)您将新DropHandler对象分配给DropHandler实例的BackendAdmin属性,而在(2)中将其分配给本地{{1}变量。

您收到错误是因为DropHandler被解释器自动移动到方法的顶部(它被称为 Hoisting ),您的代码实际上如下所示:

var

因此,您尝试调用该函数,该函数实际上被空变量覆盖。

PS:找不到JS变量提升的真正好的解释,但这是谷歌的事情:http://blog.binarymist.net/2011/11/14/scoping-hoisting-in-javascript/

答案 1 :(得分:1)

您不能拥有两个具有相同名称的独立实体(局部变量和范围内的函数),并且它们仍然是可单独访问的实体。

创建局部变量时,它会暂时覆盖/隐藏该范围内的同名函数,并且该范围内不再可以访问该函数名称。更改任何一个的名称,它应该像这样工作:

var BackendAdmin = function(){
    this.DropHandler = new DropHandler();//(1);
    var myDropHandler = new DropHandler();//(2);
}

this.DropHandler有效,因为在这种情况下DropHandler是另一个对象的属性,因此与DropHandler()函数分开。