Какова область видимости переменных в JavaScript?

Я использовал следующую процедуру, чтобы позаботиться об этом:

create or replace procedure drop_table_if_exists ( p_table_name varchar2 )
is
  it_exist number;
begin
  select count(*) 
     into it_exists
     from user_tables
     where table_name = p_table_name
  ;
  if it_exists >= 1 then
    execute immediate 'drop table '||p_table_name;
  end if;
end;
/

exec drop_table_if_exists ( 'TABLE_TO_DROP' );
1904
задан John Slegers 1 May 2018 в 10:15
поделиться

5 ответов

Я думаю о лучшем, которое я могу сделать, дают Вам набор примеров для изучения. Программисты JavaScript практически оцениваются тем, как хорошо они понимают объем. Это может время от времени быть довольно парадоксально.

  1. А глобально ограниченная по объему переменная

    // global scope
    var a = 1;
    
    function one() {
      alert(a); // alerts '1'
    }
    
  2. Локальный объем

    // global scope
    var a = 1;
    
    function two(a) { // passing (a) makes it local scope
      alert(a); // alerts the given argument, not the global value of '1'
    }
    
    // local scope again
    function three() {
      var a = 3;
      alert(a); // alerts '3'
    }
    
  3. Промежуточное звено : Никакая такая вещь как область действия блока в JavaScript (ES5; ES6 представляет let )

    a.

    var a = 1;
    
    function four() {
      if (true) {
        var a = 4;
      }
    
      alert(a); // alerts '4', not the global value of '1'
    }
    

    b.

    var a = 1;
    
    function one() {
      if (true) {
        let a = 4;
      }
    
      alert(a); // alerts '1' because the 'let' keyword uses block scoping
    }
    
  4. Промежуточное звено : Свойства объектов

    var a = 1;
    
    function Five() {
      this.a = 5;
    }
    
    alert(new Five().a); // alerts '5'
    
  5. Усовершенствованный : Закрытие

    var a = 1;
    
    var six = (function() {
      var a = 6;
    
      return function() {
        // JavaScript "closure" means I have access to 'a' in here,
        // because it is defined in the function in which I was defined.
        alert(a); // alerts '6'
      };
    })();
    
  6. Усовершенствованный : Основанное на прототипе разрешение объема

    var a = 1;
    
    function seven() {
      this.a = 7;
    }
    
    // [object].prototype.property loses to
    // [object].property in the lookup chain. For example...
    
    // Won't get reached, because 'a' is set in the constructor above.
    seven.prototype.a = -1;
    
    // Will get reached, even though 'b' is NOT set in the constructor.
    seven.prototype.b = 8;
    
    alert(new seven().a); // alerts '7'
    alert(new seven().b); // alerts '8'
    
    <час>
  7. Global+Local: дополнительный сложный Случай

    var x = 5;
    
    (function () {
        console.log(x);
        var x = 10;
        console.log(x); 
    })();
    

    Это распечатает undefined и 10, а не 5 и 10, так как JavaScript всегда перемещает объявления переменной (не инициализации) к вершине объема, делая код эквивалентным:

    var x = 5;
    
    (function () {
        var x;
        console.log(x);
        x = 10;
        console.log(x); 
    })();
    
  8. Выгода ограниченная по объему пунктом переменная

    var e = 5;
    console.log(e);
    try {
        throw 6;
    } catch (e) {
        console.log(e);
    }
    console.log(e);
    

    Это распечатает 5, 6, 5. В тенях пункта e выгоды глобальные и локальные переменные. Но этот специальный объем только для пойманной переменной. Если Вы пишете var f; внутренняя часть пункт выгоды, то это - точно то же, как будто Вы определили его прежде или после блока try-catch.

2456
ответ дан mplungjan 1 May 2018 в 20:15
поделиться

Вот пример:

<script>

var globalVariable = 7; //==window.globalVariable

function aGlobal( param ) { //==window.aGlobal(); 
                            //param is only accessible in this function
  var scopedToFunction = {
    //can't be accessed outside of this function

    nested : 3 //accessible by: scopedToFunction.nested
  };

  anotherGlobal = {
    //global because there's no `var`
  }; 

}

</script>

Вы захотите исследовать закрытия, и как использовать их для создания члены парламента, не занимающие официального поста .

38
ответ дан geowa4 1 May 2018 в 20:15
поделиться

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

элементом в цепочке объема является в основном Карта с указателем на его родительский объем.

При разрешении переменной, JavaScript запускается в самом внутреннем объеме и поисках за пределы.

232
ответ дан krosenvold 1 May 2018 в 20:15
поделиться
  • 1
    Большое спасибо Markos, Вашему ответу действительно помогают. – IneedHelp 14 September 2012 в 19:14

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

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

107
ответ дан gilly3 1 May 2018 в 20:15
поделиться

В «Javascript 1.7» (расширение Mozilla для Javascript) можно также объявить переменные области блока с помощью оператора let :

 var a = 4;
 let (a = 3) {
   alert(a); // 3
 }
 alert(a);   // 4
26
ответ дан 22 November 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: