在这种情况下,我定义了一个名为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);
}
答案 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()
函数分开。