Если анонимные функции JavaScript могут обращаться ко всем переменным, как насчет обычных функций? - PullRequest
0 голосов
/ 08 декабря 2018

В Javascript переменные функции являются локальными, если они не объявлены с помощью "var".То есть, если эти функции не являются анонимными (как те, которые используются в setInterval и setTimeout. В этом случае они имеют глобальный доступ ко всем доступным переменным в области действия, которая вызывает анонимные функции.

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

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

myFunction()
function myFunction() {
    var a='b' //,b=...,c=...,d=...,e=...,f=...,g=...,h=...,i=...,j=...,k=...
    setInterval(function(){ alert(a) }, 3000) // Works even though a is local
    setInterval(function(){ dummy() }, 3000) // Fails, but would work if I used dummy(a).
    // But then I'd have to use dummy(a,b,c,d,e,f,g,h,i,j,k,...)
}

function dummy() { // It would have worked had I used dummy(a)
    alert(a)
}

1 Ответ

0 голосов
/ 08 декабря 2018

Вопрос не об анонимных функциях.Возьмем две строки:

 setInterval(function named (){ alert(a) }, 3000);
 setInterval(function(){ alert(a) }, 3000);

обе работают, хотя одна названа, а другая нет.Настоящая проблема здесь заключается в том, что a не виден для dummy, потому что dummy объявляется вне области действия a:

  { // brackets start a scope
    let a = "b"; // a gets declared in this scope
    //...
  } // scope ends

  function dummy() { /*..*/ } // outside of scope

Чтобы решить эту проблему, переместите dummy вa Область действия:

 function myFunction() { // start of scope
   let a = "b"; 
   setInterval(function(){ dummy() }, 3000);

   function dummy() { 
    alert(a); // a can be accessed as it is inside of the scope
   }
 } // end of scope

(я использовал let вместо var, потому что он более строгий и, следовательно, более простой для обоснования, правила определения объема)

...