отсутствует } после тела функции … хотя все закрыто правильно

#javascript

#javascript

Вопрос:

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

 javascript:(function() {
  function loadMyScript() {
    var my_src = document.createElement('script');
    my_src.src='url_of_my_script';
    document.body.appendChild(my_src);
  }
  function loadJQuery() {
    var otherlib = false;
    if (typeof $ === 'function') {
      otherlib = true;
    }
    function getScript(url, success) {
      var script = document.createElement('script');
      script.src = url;
      script.onload = success;
      document.body.appendChild(script);
      if (otherlib) {
        jQuery.noConflict();
      }
    }
    getScript('http://code.jquery.com/jquery-latest.min.js', loadMyScript);
  }
  if (typeof jQuery === 'undefined') {
    loadJQuery();
  } else {
    loadMyScript();
  }
})();
  

Помещая этот код в bookmarket в Firefox 4, я получаю «отсутствует } после тела функции», когда пытаюсь его запустить. Однако выполнение того же кода в консоли Firebug завершается успешно. Chrome выдает аналогичные результаты; букмарклет выдает «Неожиданное завершение ввода», в то время как выполнение кода в консоли завершается успешно.

Кто-нибудь знает, что здесь происходит?

(В стороне: функция getScript несколько неполна. Я просто вырвал несколько вещей, чтобы попытаться решить эту синтаксическую проблему)

Комментарии:

1. Я уверен, что это не проблема, но у вас нет точки с запятой после my_src.src='url_of_my_script' . Я бы исправил это просто для согласованности 🙂

2. Это ведущее «javascript:» не нужно. редактировать о, подождите, за исключением этого чрезвычайно важного слова » букмарклет » в вашем вопросе 🙂 Извините за это; неважно.

Ответ №1:

 my_src.src = 'url_of_my_script'
  

В этой строке отсутствует точка с запятой. Это была единственная ошибка, которую я получил.

Комментарии:

1. Упс, убрал это, когда вставлял и редактировал код. Вставляю его обратно. Проблема по-прежнему сохраняется.

Ответ №2:

Когда вы делаете букмарклеты…

Используйте комментарии в стиле блоков вместо однострочных комментариев

 function () {

  /*Right:*/
  return 0;

  //Wrong:
  return 0;
}
  

После переноса в однострочный код букмарклета приведенное выше становится:

 function () { /*Right:*/ return 0; //Wrong: return 0; }
  

Проверьте, нет ли пропущенных точек с запятой

Пропущенные точки с запятой допустимы до тех пор, пока за ними не следует оператор. Для простоты лучше всегда использовать их в букмарклете.

 function () {

  /*Right:*/
  var a = 0;

  /*Wrong:*/
  a = 0

  /*Doesn't matter:*/
  a = 0
}
  

Вышесказанное становится:

 function () { /*Right:*/ var a = 0; /*Wrong:*/ a = 0 /*Doesn't matter:*/ a = 0 }
  

Комментарии:

1. Для меня это тоже был однострочный комментарий. Хороший ответ, потому что на рассматриваемый код это не влияет, но это обычная ошибка.

Ответ №3:

Попробуйте переместить круглые скобки вызова внутрь круглых скобок, которые закрывают функцию.

Вот так:

 (function(){
   // do stuff
}())
  

Ответ №4:

У меня была похожая проблема — странная ошибка Javascript в самом базовом фрагменте кода. Еще более странным было то, что код отлично работал локально (Win7), но не запускался на моем сервере (Ubuntu).

По наитию я скопировал текст внутри файла .js и вставил в другой текстовый редактор (TextPad), отличный от моей IDE (NetBeans), и сохранил файл. На этот раз, когда я загрузил файл, ошибки Javascript не было.

По какой-то причине в исходном файле удалялись разрывы строк.

Ответ №5:

Я думаю, что проблема в первой строке :

 javascript:(function() {
  

здесь у вас есть два варианта :

даже если вы находитесь на объекте и делаете что-то вроде :

 var myobj = {
    javascript: function () {
        // code here
    }
}
  

или вы создаете функцию :

 var func_name = function () {
    // code here
}
  

или, в конечном итоге, что-то вроде этого :

 ;(function($) {func_name = function (sBind, oFunction) {
    // code here
}})();
  

Ответ №6:

В конце следующей строки не хватает точки с запятой:

 my_src.src='url_of_my_script'
  

Ответ №7:

Внутренняя функция, определенная в loadJQuery, сбивала с толку. Я изменил все примерно так:

 javascript:(function() {
  function loadMyScript() {
    var my_src = document.createElement('script');
    my_src.src = 'url_of_my_script';
    document.body.appendChild(my_src);
  }
  function getScript(url, success) { // <- moved this function outside loadJQuery
    var script = document.createElement('script');
    script.src = url;
    script.onload = success;
    document.body.appendChild(script);
  }
  function loadJQuery() {
    var otherlib = false;
    if (typeof $ === 'function') {
      otherlib = true;
    }
    getScript('http://code.jquery.com/jquery-latest.min.js', function() {
      if (otherlib) {
        jQuery.noConflict();
      }
      loadMyScript();
    });
  }
  if (typeof jQuery === 'undefined') {
    loadJQuery();
  } else {
    loadMyScript();
  }
})();
  

Это ново для меня. Не разрешены ли вложенные функции в букмарклетах? Я еще не видел никакой документации по этому поводу.