2012-01-12 4 views
1

Я использую jsio (jslibs - http://code.google.com/p/jslibs/wiki/jsio) и нахожусь в ошибке на Safari. Неожиданный токен '='JS Ошибка в Safari: Неожиданный токен '='

Проблема с этой частью кода.

this.debugPath = function(path) { return path; } 

// IE6 won't return an anonymous function from eval, so use the function constructor instead 
var rawEval = (typeof eval('(function(){})') == 'undefined') 
      ? function(src, path) { return (new Function('return ' + src))(); } 
      : function(src, path) { var src = src + '\n//@ sourceURL=' + path; return window.eval(src); }; 

// provide an eval with reasonable debugging 
this.eval = function(code, path, origCode) { 
...................... 

Проблема, кажется, в той строке, где rawEval время его назначения. Комментируя это, ошибка переместилась в другое место. Кто-нибудь сталкивался с этой проблемой раньше?

Помощь?

Спасибо.

+0

'function (src, path) {var src = src ...}' может быть ошибкой. Вы используете 'src' один раз, чтобы объявить локальную переменную, но это не локальная переменная. Вы просто переписываете формальный параметр с тем же именем. –

+0

Btw, 'new Function (...)' связывается в глобальной области, тогда как в ES3 'window.eval' связывается в области вызова, поэтому эти два не эквивалентны. Один из способов обойти проблему IE6 eval состоит в том, чтобы добавить строку '" 0, "' к тексту выражения, который вы оцениваете. –

+0

@MikeSamuel: Вы имеете в виду следующее? Пробовал, но не работал. 'вар rawEval = функция (ЦСИ, путь) {' ' \t возвращение Eval ("0" + ЦСИ + '\ п // @ sourceURL =' + путь),' ' };' – Navneet

ответ

0

Это для справок в будущем, если кто-то (включая меня) снова столкнется с этой проблемой.

Ошибка, которую Safari бросает в моем случае, является ложной или, по крайней мере, довольно неоднозначной.

Я определил класс в одной из моих библиотек. И я не хотел хранить дескриптор/ссылку на объект этого класса. Итак, я сделал что-то вроде:

function reply(...) { 
    new ClassName(.....).onHide = bind(...); 
    .......... 
} 

Когда я изменил его на следующее, Сафари перестала жаловаться.

function reply(...) { 
    var dg = new ClassName(......); 
    dg.onHide = bind(...); 
    .............. 
} 

Объявление о новом объекте и определении его свойств (или функций) может быть проблемой.