Выше ответ объясняет очень хорошо. Просто добавьте одно. Если вы используете использование eclipse, используйте ctrl + shift + T и введите структуру пакета класса (например: gateway.smpp.PDUEventListener), вы найдете все банки / проекты где он присутствует. Удалите ненужные банки из classpath или добавьте выше в путь класса. Теперь он подберет правильный.
@thefourtheye верно, говоря, что эти переменные не могут быть доступны до их объявления. Однако это немного сложнее.
Не были ли объявлены переменные, объявленные с
blockquote>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, которое вызывается слишком рано).
Есть ли разница между
< / blockquote>let
иconst
в этом вопросе?Нет, они работают так же, как и подъем. Единственное различие между ними заключается в том, что мусор
const
должен быть и может быть назначен только в части инициализации объявления (const one = 1;
, какconst one;
, так и более поздние переназначения, такие какone = 2
являются недопустимыми).1:
var
объявления все еще работают только на функциональном уровне, конечно
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([])
Цитирование спецификаций ECMAScript 6 (ECMAScript 2015), let
и const
, ,
. Эти переменные создаются, когда их содержащая лексическая среда создается но не может быть достигнут каким-либо образом до тех пор, пока не будет оценена LexicalBinding переменной.
Итак, чтобы ответить на ваш вопрос, да,
let
иconst
, но вы не можете получить к ним доступ до фактическая декларация оценивается во время выполнения.
var
, поднимаются на область блока, а не толькоlet
. – Bergi 8 January 2016 в 11:23var
). – Bergi 10 January 2016 в 00:02let foo = () => bar; let bar = 'bar'; foo();
иллюстрирует , все объявления повышают эффект i> еще лучше, потому что это не очевидно из-за временной мертвой зоны. – estus 19 July 2016 в 13:59