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