#javascript #with-statement #sandbox
#javascript #с помощью-заявления #песочница
Вопрос:
Я наткнулся на этот пост Дастина об использовании with
ключевого слова для изолированной обработки некоторых модулей:
http://dustindiaz.com/sandboxing-javascript
Фактический фрагмент кода выглядит следующим образом:
(function () {
with (this) {
{{ender}}
{{library}}
}
}).call({})
Может ли кто-нибудь, пожалуйста, лучше объяснить, что он делает? Я не совсем в состоянии понять преимущество использования with(this)
здесь, и что {{ender}}
и {{library}}
означает. Он сравнивает этот подход с использованием iframes (что я понимаю), но я не совсем понимаю, что он пытается здесь сделать.
Ответ №1:
Он заставляет все переменные (и функции), объявленные внутри этой функции, находиться внутри контекста this
, то есть контекста функции переноса.
Обычно, если вы создаете переменную, используя var
внутри функции, она локальна для этой функции, и это хорошо. Но что, если вы этого не сделаете? В этом случае при использовании with
все переменные, которые в противном случае были бы глобальными, вместо этого находятся в контексте with (в данном случае контекст this
функции.)
Комментарии:
1. Я попытался определить переменную без
var
ключевого слова внутриwith
блока, и это влияет на глобальную область видимости, т. Е. Я могу распечатать эту переменную на консоль после выполнения анонимной функции.2. Ладно, понял. Когда вы делаете
this.foo = 'bar'
внутриwith
блока,foo
свойство устанавливается только внутриwith
блока и не устанавливается в глобальном контексте окна.