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 in Sandy Eggo

4

4 に答える 4

4

これが評価される時点で:

 aContract.prototype = { ... }

これはまだ評価されていません:

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

したがってaContract.prototype.someOtherFunction、 に設定されundefinedます。

2 番目が機能する理由は、関数宣言(2 番目は、最初は式) が他のステートメントの前に評価されるためです。ここに詳細があります:名前付き関数式の解明

于 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: The Good Parts ページ 113 の検証。

于 2009-06-26T23:22:51.943 に答える
0

グローバル スコープでvarは、関数ローカル スコープとは異なる動作をするようです。関数ローカル スコープでは、var宣言された変数は関数の先頭に持ち上げられます (つまり、関数内の任意の場所でキーワードvarを使用して宣言された変数は、その関数内の他の場所で使用できます)。しかし、グローバル スコープでは、キーワードを使用して変数を宣言するだけで、おそらくfunction同じ結果が得られます (つまり、キーワードで宣言された変数は、functionそのグローバル スコープ内のどこでも、その宣言の前の行でも使用できます)。

于 2009-06-26T23:22:42.617 に答える