2009-06-26 4 views
0

Почему это не нормально?Почему это говорит, что xxx не является функцией

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

ответ

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 
}; 
4

В то время это оценивается:

aContract.prototype = { ... } 

это еще не был оценен:

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

Таким образом aContract.prototype.someOtherFunction установлен на undefined.

Причина, по которой вторая работает, состоит в том, что функции декларации (что второе - это первое выражение) оцениваются перед любыми другими операторами. Здесь есть более подробная информация: Named function expressions demystified

0

Похоже, что в глобальном масштабе var работает по-разному, чем в функционально-локальных областях. В функционально-локальных областях var -определенные переменные поднимаются до вершины функции (то есть любая переменная, объявленная где угодно внутри функции с ключевым словом var, доступна где-нибудь еще внутри этой функции). Но в глобальном масштабе, возможно, только использование ключевого слова function для объявления переменной дает тот же результат (т. Е. Что переменная, объявленная с ключевым словом function, будет доступна в любом месте этой глобальной области, даже в строках, предшествующих этому объявлению).

+0

Это не так. Вызов blah() отображает «undefined»: function blah() { alert (x); var x = 5; } –

+0

Это не совсем то, что происходит. например. (function() {var a = x + 1; var x = 2; return a;})() возвращает NaN. Вы можете подумать больше (функция() {var a = function() {return x + 1}, var x = 2; return a()})() , которая возвращает 3. – BaroqueBobcat

1

Это из-за подъема. Операторы функций перемещаются в верхней части области действия.

Edit: верификация Крокфорд в JavaScript: The Good Parts страница 113.