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

最佳答案

区别在于,在(1)中,将新的DropHandler对象分配给DropHandler实例的BackendAdmin属性,在(2)中,将其分配给局部DropHandler变量。

之所以会出错,是因为解释器将var自动移到方法的顶部(称为提升),并且您的代码实际上如下所示:

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/

10-07 14:26