为什么这不行?
aContract = function(){};
aContract.prototype = {
someFunction: function() {
alert('yo');
},
someOtherFunction: some$Other$Function
};
var some$Other$Function = function() {
alert('Yo yo yo');
};
var c = new aContract();
c.someFunction();
c.someOtherFunction();
Firebug说c.someOtherFunction不是函数
但是这很好用
aContract = function(){};
aContract.prototype = {
someFunction: function() {
alert('yo');
},
someOtherFunction: some$Other$Function
};
function some$Other$Function() {
alert('Yo yo yo');
};
var c = new aContract();
c.someFunction();
c.someOtherFunction();
我在这里失踪了什么?我更喜欢使用第一种方法在javascript中编码,这通常可以正常工作,但在我原型时似乎无法正常工作。
谢谢, 〜在Sandy Eggo
答案 0 :(得分:4)
评估时:
aContract.prototype = { ... }
尚未对此进行评估:
var some$Other$Function = function() { ... }
因此aContract.prototype.someOtherFunction
设置为undefined
。
第二个工作的原因是因为函数声明(第二个是,第一个是表达式)在任何其他语句之前被评估。这里有更多详细信息:Named function expressions demystified
答案 1 :(得分:3)
在您实际创建some$Other$Function
之前,您已将aContract.prototype.someOtherFunction
分配给some$Other$Function
。陈述的顺序很重要。如果你改变了事物的顺序,你就会很好:
var some$Other$Function = function() {
alert('Yo yo yo');
};
aContract = function(){};
aContract.prototype = {
someFunction: function() {
alert('yo');
},
someOtherFunction: some$Other$Function
};
答案 2 :(得分:1)
这是由于吊装。函数语句被移到其范围的顶部。
编辑:验证Crockford的JavaScript:好零件页面113.
答案 3 :(得分:0)
看来,在全局范围内,var
的工作方式与功能本地范围的工作方式不同。在函数本地范围中,var
- 声明的变量被提升到函数的顶部(即,在函数内任何位置使用关键字var
声明的变量在该函数内的任何其他地方都可用)。但是在全局范围内,也许只使用关键字function
来声明变量会产生相同的结果(即,使用关键字function
声明的变量将在该全局范围内的任何位置可用,甚至在该声明之前的行中。)