为什么说xxx不是函数

时间:2009-06-26 23:13:54

标签: javascript closures unobtrusive-javascript

为什么这不行?

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

4 个答案:

答案 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声明的变量将在该全局范围内的任何位置可用,甚至在该声明之前的行中。)