Разница заключается в определении области. var
привязан к ближайшему функциональному блоку, а let
- к ближайшему блоку , содержащему блок , который может быть меньше функционального блока. Оба являются глобальными, если вне любого блока.
Кроме того, переменные, объявленные с помощью let
, недоступны до того, как они будут объявлены в их закрывающем блоке. Как показано в демо, это вызовет исключение ReferenceError.
Демо :
var html = '';
write('#### global ####\n');
write('globalVar: ' + globalVar); //undefined, but visible
try {
write('globalLet: ' + globalLet); //undefined, *not* visible
} catch (exception) {
write('globalLet: exception');
}
write('\nset variables');
var globalVar = 'globalVar';
let globalLet = 'globalLet';
write('\nglobalVar: ' + globalVar);
write('globalLet: ' + globalLet);
function functionScoped() {
write('\n#### function ####');
write('\nfunctionVar: ' + functionVar); //undefined, but visible
try {
write('functionLet: ' + functionLet); //undefined, *not* visible
} catch (exception) {
write('functionLet: exception');
}
write('\nset variables');
var functionVar = 'functionVar';
let functionLet = 'functionLet';
write('\nfunctionVar: ' + functionVar);
write('functionLet: ' + functionLet);
}
function blockScoped() {
write('\n#### block ####');
write('\nblockVar: ' + blockVar); //undefined, but visible
try {
write('blockLet: ' + blockLet); //undefined, *not* visible
} catch (exception) {
write('blockLet: exception');
}
for (var blockVar = 'blockVar', blockIndex = 0; blockIndex < 1; blockIndex++) {
write('\nblockVar: ' + blockVar); // visible here and whole function
};
for (let blockLet = 'blockLet', letIndex = 0; letIndex < 1; letIndex++) {
write('blockLet: ' + blockLet); // visible only here
};
write('\nblockVar: ' + blockVar);
try {
write('blockLet: ' + blockLet); //undefined, *not* visible
} catch (exception) {
write('blockLet: exception');
}
}
function write(line) {
html += (line ? line : '') + '
';
}
functionScoped();
blockScoped();
document.getElementById('results').innerHTML = html;
Они очень похожи, если использовать это вне функционального блока.
let me = 'go'; // globally scoped
var i = 'able'; // globally scoped
Однако глобальные переменные, определенные с помощью let
, не будут добавлены как свойства на глобальном объекте window
, таком как те, которые определены с помощью var
.
console.log(window.me); // undefined
console.log(window.i); // 'able'
Они идентичны при использовании этого в функциональном блоке.
function ingWithinEstablishedParameters() {
let terOfRecommendation = 'awesome worker!'; //function block scoped
var sityCheerleading = 'go!'; //function block scoped
}
Вот разница. let
видна только в цикле for()
, а var
видна всей функции.
function allyIlliterate() {
//tuce is *not* visible out here
for( let tuce = 0; tuce < 5; tuce++ ) {
//tuce is only visible in here (and in the for() parentheses)
//and there is a separate tuce variable for each iteration of the loop
}
//tuce is *not* visible out here
}
function byE40() {
//nish *is* visible out here
for( var nish = 0; nish < 5; nish++ ) {
//nish is visible to the whole function
}
//nish *is* visible out here
}
Предполагая строгий режим, var
будет позвольте вам повторно объявить одну и ту же переменную в той же области. С другой стороны, let
не будет:
'use strict';
let me = 'foo';
let me = 'bar'; // SyntaxError: Identifier 'me' has already been declared
'use strict';
var me = 'foo';
var me = 'bar'; // No problem, `me` is replaced.
Пока вы делаете все ваши заглушки частью одной и той же цепочки , Mockito будет продолжать их последовательно, всегда повторяя окончательный вызов.
// returns false, false, true, true, true...
when(your.mockedCall(param))'
.thenReturn(Boolean.FALSE, Boolean.FALSE, Boolean.TRUE);
Вы также можете сделать это с помощью этого синтаксиса ...
// returns false, false, true, true, true...
when(your.mockedCall(param))
.thenReturn(Boolean.FALSE)
.thenReturn(Boolean.FALSE)
.thenReturn(Boolean.TRUE);
... что может пригодиться, если действия не являются всеми возвращаемыми значениями.
// returns false, false, true, then throws an exception
when(your.mockedCall(param))
.thenReturn(Boolean.FALSE)
.thenReturn(Boolean.FALSE)
.thenReturn(Boolean.TRUE)
.thenThrow(new Exception("Called too many times!"));
Если вы хотите, чтобы вещи стали более сложными, подумайте о том, чтобы написать Ответ .