ошибка, когда за объявлением функции не стоит точка с запятой в глобальном разделе emit набора правил? - PullRequest
0 голосов
/ 13 апреля 2011

Вот два набора правил, которые иллюстрируют совершенно неожиданное поведение. Это ошибка?

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

test1 = function(){console.log("test1");}  ;// <==

но это опасно, я думаю, потому что это не обязательно в javascript.

Пример 1 букмарклет :

javascript:(function(){
  var d=document;var s=d.createElement('script');s.text=&quot;
  KOBJ_config={'rids':['a1135x27']};&quot;;d.body.appendChild(s);
  var l=d.createElement('script');l.src='http://init.kobj.net/js/shared/kobj-static.js';
  d.body.appendChild(l);})()

Пример 2, букмарклет :

javascript:(function(){
  var d=document;var s=d.createElement('script');s.text=&quot;
  KOBJ_config={'rids':['a1135x27']};&quot;;d.body.appendChild(s);
  var l=d.createElement('script');l.src='http://init.kobj.net/js/shared/kobj-static.js';
  d.body.appendChild(l);})()

Rulesets:

ruleset a1135x27 {
  meta {
    name "odd1"
    description <<
        demonstrate oddity 1
    >>
    author "Loïc Devaux"
    logging on
  }

  dispatch {
    // Some example dispatch domains
    // domain "example.com"
    // domain "other.example.com"
  }

  global {

    emit  <|



       /* this breaks javascript code*/
       // => 16:27:58 ERROR general Closure Executed with error a1135x27 - 13025536774875610960847698152Exception: test1 is not defined
       test1 = function(){console.log("test1")}

        /* this won't break */
        //test1 = function(){console.log("test1")};
        /* */

       /* this won't break */
       //test1 = function(){console.log("test1")}
       //test2 = function(){console.log("test2")};
       /* */

    |>;
  }

  rule first_rule {
    select when pageview ".*" setting ()
    pre { 

        }
    {
      emit <|

           test1();


          |>;  
    }

  }




}



ruleset a1135x28 {
  meta {
    name "odd2"
    description <<
        demonstrate oddity 2
    >>
    author "Loic Devaux"
    logging on
  }

 dispatch {
    // Some example dispatch domains
    // domain "example.com"
    // domain "other.example.com"
  }

  global {

    emit  <|

       /*  test1 will be executed even though it hasn't been called anywhere */
       //test1 = function(){console.log("test1");}
        /* */

        /* test1 won't get executed */
        /* 
            test1 = function(){console.log("test1");};
        */
        /* */


        /* this won't break and test2 will be executed although it hasn't been called anywhere */

            test1 = function(){console.log("test1");}
            test2 = function(){console.log("test2");}

        /* */


    |>;
  }

  rule first_rule {
    select when pageview ".*" setting ()
    pre { 

        }
    {
      emit <|

          console.log('running first_rule');

          |>;  
    }

  }




}

1 Ответ

2 голосов
/ 16 апреля 2011

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

test2 = function(){console.log("test2")};

должно быть

test2 = function(){console.log("test2");};

, поскольку оба назначения являются оператором,это вызов метода console.log().

Когда вы генерируете недопустимый javascript, могут произойти всевозможные странные вещи.Хотя большинство из них приводит к синтаксической ошибке javascript, замыкания, которые KNS использует для переноса кода (и предотвращения непреднамеренной утечки переменных), могут иметь побочные эффекты, которые вы наблюдаете.гибкость javascript-анализатора, позволяющая опустить важные точки с запятой.Это не считается ошибкой KRL.

...