объявить let переменной в javascript в вызове функции [duplicate]

Выше ответ объясняет очень хорошо. Просто добавьте одно. Если вы используете использование eclipse, используйте ctrl + shift + T и введите структуру пакета класса (например: gateway.smpp.PDUEventListener), вы найдете все банки / проекты где он присутствует. Удалите ненужные банки из classpath или добавьте выше в путь класса. Теперь он подберет правильный.

181
задан Michał Perłakowski 19 November 2016 в 14:08
поделиться

3 ответа

@thefourtheye верно, говоря, что эти переменные не могут быть доступны до их объявления. Однако это немного сложнее.

Не были ли объявлены переменные, объявленные с let или const? Что действительно происходит здесь?

Все объявления (var, let, const, function, function*, class) «подняты» в JavaScript. Это означает, что если имя объявлено в области видимости, то в этой области идентификатор всегда ссылается на эту конкретную переменную:

x = "global";
// function scope:
(function() {
    x; // not "global"

    var/let/… x;
}());
// block scope (not for `var`s):
{
    x; // not "global"

    let/const/… x;
}

Это верно как для функциональных, так и для блоков.

Разница между объявлениями var / function / function* и let / const / class declara & shy; tion является инициализацией. Первые инициализируются с помощью функции undefined или (генератора), когда привязка создается в верхней части области. Однако лексически объявленные переменные остаются неинициализированными. Это означает, что при попытке доступа к нему возникает исключение ReferenceError. Он будет инициализироваться только тогда, когда оценивается инструкция let / const / class, все до (выше), которое называется временной зоной .

x = y = "global";
(function() {
    x; // undefined
    y; // Reference error: y is not defined

    var x = "local";
    let y = "local";
}());

Обратите внимание, что оператор let y; инициализирует переменную с undefined, например let y = undefined;.

Мертвая зона temporal не является синтаксическим местоположением, время между созданием переменной (области) и инициализацией. Это не ошибка ссылки на переменную в коде выше объявления, если этот код не выполняется (например, тело функции или просто мертвый код), и он будет генерировать исключение, если вы получите доступ к переменной до инициализации, даже если доступ код ниже объявления (например, в объявлении с функцией hoisted, которое вызывается слишком рано).

Есть ли разница между let и const в этом вопросе?

< / blockquote>

Нет, они работают так же, как и подъем. Единственное различие между ними заключается в том, что мусор const должен быть и может быть назначен только в части инициализации объявления (const one = 1;, как const one;, так и более поздние переназначения, такие как one = 2 являются недопустимыми).

1: var объявления все еще работают только на функциональном уровне, конечно

231
ответ дан Bergi 16 August 2018 в 03:31
поделиться
  • 1
    @janaspage: Вот что говорит ответ, не так ли? Btw, все, кроме объявлений var, поднимаются на область блока, а не только let. – Bergi 8 January 2016 в 11:23
  • 2
    Ах, это подразумевалось. Подъем всегда происходит внутри области видимости, а блоки - все для всего (кроме var). – Bergi 10 January 2016 в 00:02
  • 3
    Я нахожу, что что-то вроде let foo = () => bar; let bar = 'bar'; foo(); иллюстрирует , все объявления повышают эффект еще лучше, потому что это не очевидно из-за временной мертвой зоны. – estus 19 July 2016 в 13:59
  • 4
    Я собирался спросить о ссылке на определение let в функции, объявленной перед let (т. Е. Замыканием). Я думаю, что это отвечает на вопрос, это законно, но будет ошибкой ref, если функция вызывается до выполнения оператора let, и будет нормально, если функция будет вызвана впоследствии. возможно, это может быть добавлено к ответу, если это правда? – Mike Lippert 25 October 2016 в 18:07
  • 5
    @MikeLippert Да, это правильно. Вы не должны вызывать функцию, которая обращается к переменной до ее инициализации. Этот сценарий возникает, например, при каждом объявлении функции hoisted. – Bergi 25 October 2016 в 18:23

ES6 вводит переменные Let, которые возникают с block level scoping. До ES5 у нас не было block level scoping, поэтому переменные, объявленные внутри блока, всегда hoisted отображаются на уровне уровня функции.

В основном Scope ссылается на то, где в вашей программе ваши переменные видны, что определяет, где вам разрешено использовать объявленные вами переменные. В ES5 имеем global scope,function scope and try/catch scope, с ES6 мы также получаем оценку уровня блока, используя Let.

  • Когда вы определяете переменную с ключевым словом var, она известна всей функцией с момента ее определения.
  • Когда вы определяете переменную с выражением let, это только известный в блоке, который он определен.
     function doSomething(arr){
         //i is known here but undefined
         //j is not known here
    
         console.log(i);
         console.log(j);
    
         for(var i=0; i<arr.length; i++){
             //i is known here
         }
    
         //i is known here
         //j is not known here
    
         console.log(i);
         console.log(j);
    
         for(let j=0; j<arr.length; j++){
             //j is known here
         }
    
         //i is known here
         //j is not known here
    
         console.log(i);
         console.log(j);
     }
    
     doSomething(["Thalaivar", "Vinoth", "Kabali", "Dinesh"]);
    

Если вы запустите код, вы увидите, что переменная j известна только в loop, а не до и после. Тем не менее наша переменная i известна в entire function с момента ее определения вперед.

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

for(var i=1; i<6; i++){
   setTimeout(function(){
      console.log(i);
   },1000)
}

for(let i=1; i<6; i++){
   setTimeout(function(){
      console.log(i);
   },1000)
}

Первый цикл for всегда печатает значение last , при этом let он создает новую область и связывает новые значения с нами 1, 2, 3, 4, 5.

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

const foo = {};
foo.bar = 42;
console.log(foo.bar); //works

const name = []
name.push("Vinoth");
console.log(name); //works

const age = 100;
age = 20; //Throws Uncaught TypeError: Assignment to constant variable.

console.log(age);

Если константа относится к object, она всегда будет ссылаться на object, но сама object может быть изменена ( если он изменен). Если вам нравится иметь неизменяемый object, вы можете использовать Object.freeze([])

15
ответ дан Liren Yeo 16 August 2018 в 03:31
поделиться

Цитирование спецификаций ECMAScript 6 (ECMAScript 2015), let и const, ,

. Эти переменные создаются, когда их содержащая лексическая среда создается но не может быть достигнут каким-либо образом до тех пор, пока не будет оценена LexicalBinding переменной.

Итак, чтобы ответить на ваш вопрос, да, let и const, но вы не можете получить к ним доступ до фактическая декларация оценивается во время выполнения.

61
ответ дан thefourtheye 16 August 2018 в 03:31
поделиться
Другие вопросы по тегам:

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