0

在这种情况下,我定义了一个名为 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);
}
4

2 回答 2

3

不同之处在于,在 (1) 中,您将新DropHandler对象分配给实例的DropHandler属性BackendAdmin,而在 (2) 中,您将其分配给局部DropHandler变量。

您会收到错误,因为解释器var会自动将其移动到方法的顶部(称为Hoisting),并且您的代码实际上如下所示:

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

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

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

于 2012-07-25T03:50:34.987 回答
1

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

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

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

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

于 2012-07-25T03:51:38.687 回答