Почему говорится, что ххх не является функцией - PullRequest
0 голосов
/ 27 июня 2009

почему это не хорошо?

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 в Сэнди Эгго

Ответы [ 4 ]

4 голосов
/ 27 июня 2009

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

 aContract.prototype = { ... }

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

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

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

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

3 голосов
/ 27 июня 2009

Вы назначили 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
};
1 голос
/ 27 июня 2009

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

Редактировать: Проверка JavaScript Крокфорда: страница хороших деталей 113.

0 голосов
/ 27 июня 2009

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

...