Можете ли вы использовать переменную, а также повторно объявить ее локально в замыкании? - PullRequest
0 голосов
/ 24 февраля 2020

Простой пример этого - let, но он не работает с let.

let test = 1

{
  console.log(test) // Error cannot access 'test' before initialization
  let test = 2
}
console.log(test)

с var's it вроде работает, но использование var test = 2 или test = 2 не имеет значения, так что это немного странно для меня, потому что повторное выделение теста с var test должно иметь отличается от test = 2, но это не так? : o

var test = 1

{
  console.log(test) // 1
  var test = 2
  console.log(test) // 2
}

console.log(test) // 2

но я хочу

var test = 1

{
  console.log(test) // 1
  var test = 2
  console.log(test) // 2
}

console.log(test) // 1

Есть ли способ достичь этого ????

Я был пробую это, но безуспешно:

let test = 1

{
	let test = (new Function('return test'))()
	console.log(test) // 1
	test = 2
	console.log(test) // 2
	{
		let test = (new Function('return test'))()
		console.log(test) // 2
		test = 3
		console.log(test) // 3
	}
}

console.log(test) // 1

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

если вы в порядке с переносом кода в буквальный блок, тогда вы можете достичь этого, но любой код, которому нужен доступ к внешнему, должен быть в родительском блоке, но это решение работало достаточно хорошо в моем случае

var foo = 'outer';

{
  var foo = 'inner';
  // rest of your code
}

console.log(foo);   // "outer"
  
0 голосов
/ 26 февраля 2020

Это, безусловно, возможно, если вы используете оператор with для внедрения изменяемого объекта в качестве области видимости. Затем вы можете изменить его, чтобы динамически изменять переменные в области видимости:

     let a = 1, context = {};

     with(context) {
       console.log(a);
       context.a = 2;
       console.log(a);
     }

     console.log(a);

Но , пожалуйста, не используйте это в какой-либо продуктивной базе кода .

...