2008-09-30 4 views
35

Я вызываю функцию JavaScript. Почему я иногда получить ошибку 'myFunction не определен', когда is определено?Почему моя функция JavaScript иногда «не определена»?

Например. Я иногда получаю «copyArray не определен», даже в этом примере:

function copyArray(pa) { 
    var la = []; 
    for (var i=0; i < pa.length; i++) 
     la.push(pa[i]); 
    return la; 
} 

Function.prototype.bind = function(po) { 
    var __method = this; 
    var __args = []; 

    // Sometimes errors -- in practice I inline the function as a workaround. 
    __args = copyArray(arguments); 

    return function() { 
     /* bind logic omitted for brevity */ 
    } 
} 

Как вы можете видеть, copyArray определяется прямо, так что это не может быть о том порядке, в котором файлы сценариев нагрузки ,

Я получаю это в ситуациях, которые труднее работать, когда вызывающая функция находится в другом файле, который должен быть загружен после вызываемой функции. должен быть загружен. Но это был самый простой случай, который я мог представить, и, похоже, та же проблема.

Это не происходит в течение 100% времени, поэтому я подозреваю, что проблема связана с нагрузкой. Но я понятия не имею, что.

@Hojou: Это часть проблемы. Функция, в которой я сейчас получаю эту ошибку, сама является моей addLoadEvent, которая в основном является стандартной версией общей библиотечной функции.

@James: Я так понимаю, и в функции нет синтаксической ошибки. В этом случае также сообщается о синтаксической ошибке. В этом случае я получаю только «неопределенную» ошибку.

@David: Сценарий в этом случае находится во внешнем файле, на который ссылается используя обычный < сценария SRC = «file.js» > </скрипт > метода в головной секции страницы.

@Douglas: Интересная идея, но если это так, то как мы можем когда-либо с уверенностью назвать пользовательскую функцию? В любом случае, я пробовал это, и это не сработало.

@sk: Этот метод был протестирован в разных браузерах и в основном скопирован из библиотеки Prototype.

+3

Просто из любопытства ... Есть страницы, где вы сталкиваетесь эту ошибку при выполнении скрипта и из кадров/IFRAME/всплывающих окон? – Shog9 2008-09-30 17:11:13

+1

Ummm ... нет iframes или всплывающих окон. – harpo 2008-09-30 18:49:59

ответ

7

Это не должно происходить, если вы просто включаете скрипты на странице.

Функция copyArray всегда должна быть доступна, когда код JavaScript начинает выполняться независимо от того, объявлен ли он до или после него - если вы не загружаете файлы JavaScript динамически с помощью библиотеки зависимостей. Есть проблемы со сроками, если это так.

+1

Я не смог воспроизвести или даже испытать эту проблему на некоторое время, поэтому я собираюсь предположить, что это была моя ошибка. – harpo 2009-01-04 19:41:48

4

Мое предположение, каким-то образом документ не полностью загружен к моменту вызова метода. Выполняйте ваш код после того, как документ готов к событию.

2

Синтаксическая ошибка в функции - или в коде выше - может привести к ее неопределению.

+4

Если бы это было так, это никогда не сработало. Иногда отказ не объясняется синтаксической ошибкой. – Tomalak 2008-09-30 16:49:08

0

Используйте анонимную функцию для защиты локальной таблицы символов. Что-то вроде:

(function() { 
    function copyArray(pa) { 
     // Details 
    } 

    Function.prototype.bind = function (po) { 
     __args = copyArray(arguments); 
    } 
})(); 

Это позволит создать замыкание, которое включает в себя вашу функцию в локальной таблице символов, и вы не должны зависеть от того, что будут доступны в глобальном пространстве имен при вызове функции.

2

Если вы меняете прототип встроенного объекта «функция», возможно, вы используете ошибку браузера или состояние гонки, изменяя фундаментальный встроенный объект.

Проверьте это в нескольких браузерах, чтобы узнать.

0

Я боюсь, что когда вы добавляете новый метод в класс Function (посредством prtotyping), вы фактически добавляете его ко всем объявленным функциям AS WELL AS к вашему copyArray(). В результате ваша функция copyArray() получает рекурсивно саморегуляцию. То есть должен существовать метод copyArray(). bind(), который сам вызывает вызов.

В этом случае некоторые браузеры могут помешать созданию таких опорных циклов и пожарной ошибки «функция не определена».

Встроенный код будет лучшим решением в этом случае.

2

Это не поможет решить исходную задачу, но вы всегда можете заменить вызов copyArray() с:

__args = Array.prototype.slice.call(arguments); 

Более подробная информация доступна из Google.

Я проверил выше в следующих браузерах: IE6, 7 & 8B2, Firefox 2.0.0.17 & 3.0.3, Opera 9.52, Safari для Windows, 3.1.2 и Google Chrome (независимо последняя версия была на время этого сообщения), и он работает во всех браузерах.

+0

Спасибо за подсказку. Я могу использовать это во многих местах. Тем не менее, я действительно использовал эту функцию в качестве примера. Теперь меня беспокоит то, что беспокоит меня. – harpo 2008-09-30 18:48:55

4

Проверьте свой код с помощью JSLint. Обычно он найдет тонну небольших ошибок, поэтому предупреждение «JSLint может повредить вашим чувствам» довольно хорошо. =)

20

У меня была эта функция, которая не распознавалась, как определено в последнем Firefox для Linux, хотя Chromium справлялся с этим.

То, что произошло в моем случае было то, что у меня был бывший SCRIPT блок, перед блоком, который определил функцию с проблемой, сформулировать следующим образом:

<SCRIPT src="mycode.js"/> 

(То есть, без закрывающего тега.)

Мне пришлось переделать этот блок следующим образом.

<SCRIPT src="mycode.js"></SCRIPT> 

И затем, что следовало, работало нормально ... странно, да?

+3

У меня была такая же проблема с IE9 и Chrome 14. Боль в тылу, которая ... – Joshua 2011-07-12 15:55:12

0

Это может произойти при использовании наборов фреймов. В одном кадре были определены мои переменные и методы. В другом - нет. Это было особенно запутанно при использовании отладчика и определении моей переменной, а затем неопределенной в точке останова внутри фрейма.

2

Возможно, это исправлено, но ... видимо, у firefox есть проблема с кешированием, которая является причиной того, что функции javascript не распознаются. Я действительно не знаю специфики, но если вы очистите свой кеш, который исправит проблема (пока ваш кеш не будет заполнен снова ... не очень хорошее решение). Я искал, чтобы узнать, есть ли у firefox реальное решение этого, но пока ничего ... о не все версии, я думаю это может быть только в некоторых версиях 3.6.x, не уверен ...

0

Я думаю, что ваш Javascript код должен быть помещен между тэгом, существует потребность нагрузки документа

-2

Убедитесь, что ваша функция не случайно вложенную функцию, скажем, что это было определено в функции, которая обрабатывает документ готовое событие.

0

решаемые путем удаления «асинхронной» груз:

<script type="text/javascript" src="{% static 'js/my_js_file.js' %}" async></script> 

изменилось:

<script type="text/javascript" src="{% static 'js/my_js_file.js' %}"></script> 
Смежные вопросы