0

为什么这不行?

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 中编码,这通常可以正常工作,但在我制作原型时似乎无法正常工作。

谢谢,~ck 在 Sandy Eggo

4

4 回答 4

4

在评估时:

 aContract.prototype = { ... }

这尚未评估:

var some$Other$Function = function() { ... }

因此aContract.prototype.someOtherFunction设置为undefined

第二个起作用的原因是因为函数声明(第二个是,第一个是表达式)在任何其他语句之前被评估。这里有更多细节:命名函数表达式揭秘

于 2009-06-26T23:22:33.880 回答
3

您在实际创建之前已分配some$Other$Function给. 语句的顺序很重要。如果你改变事情的顺序,你会很好:aContract.prototype.someOtherFunctionsome$Other$Function

var some$Other$Function = function() {
    alert('Yo yo yo');
};

aContract = function(){};
aContract.prototype = {
    someFunction: function() {
        alert('yo');
    },
    someOtherFunction: some$Other$Function
};
于 2009-06-26T23:22:14.800 回答
1

是吊装的缘故。函数语句被移到其作用域的顶部。

编辑:验证 Crockford 的 JavaScript:好零件第 113 页。

于 2009-06-26T23:22:51.943 回答
0

看来,在全局范围内的var工作方式与在函数本地范围内的工作方式不同。在函数局部作用域中,var-declared 变量被提升到函数的顶部(即,在函数中的任何位置使用关键字声明的任何变量都可以在该函数的var其他任何位置使用)。但是在全局范围内,也许只使用关键字function来声明变量会产生相同的结果(即,使用关键字声明的变量function将在该全局范围内的任何地方可用,即使在该声明之前的行中也是如此)。

于 2009-06-26T23:22:42.617 回答