1 (изменено: sand123, 2020-05-08 10:28:39)

Тема: JS: справочник отличий Microsoft JScript от стандарта ES3 (англ, PDF)

JScript — сценарный язык программирования компании Microsoft, являющийся реализацией стандарта ECMAScript.
По ссылке - подробная справка (на английском) в чем реализация Microsoft отличается от стандарта. Некоторые вещи мне показались странными в поведении, если искать в интернете просто про синтаксис ES3 javascript - такие тонкости нигде не всплывают.

Например, переменная с ошибкой доступна во внешней области видимости вне блока try-catch


function foo() { 
	try { 
		throw "hello"; 
	} catch(x) { 
		WScript.Echo(x); 
	}; 
	WScript.Echo(x); // x should not be visible here 
}; 

foo(); 

Output: 
hellohello 

https://regmedia.co.uk/2007/10/31/jscri … romes3.pdf

2

Re: JS: справочник отличий Microsoft JScript от стандарта ES3 (англ, PDF)

sand123 пишет:

Например, переменная с ошибкой доступна во внешней области видимости вне блока try-catch

Точнее в JScript при вызове catch объект ошибки присваивается переменной, указанной в скобках, т.е. это может быть предварительно определённая не обязательно глобальная переменная. Например, даже так:

var obj = {x: null};
with (obj) {
	try {
		throw "test";
	} catch (x) {}
}
WScript.Echo(obj.x);

3 (изменено: sand123, 2020-05-10 16:43:09)

Re: JS: справочник отличий Microsoft JScript от стандарта ES3 (англ, PDF)

wisgest
Собственно, как я и обнаружил эту особенность - блок с catch(e) перезаписал значение переменной e во внешней области видимости, чего я никак не ожидал.

4

Re: JS: справочник отличий Microsoft JScript от стандарта ES3 (англ, PDF)

sand123
Насколько я помню try-catch в JScript не создает отдельный scope. "Скопы" могут быть только глобальными или задаются внутри функции. Собственно вот и объяснение этого странного поведения. Что касается приведенного Вами кода, то x у Вас явно не декларирован, значит он в глобальном скопе. Чтобы ограничить область видимости, то надо явно использовать var в нужном скопе.