Изолированный JavaScript с использованием ключевого слова

#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 блока и не устанавливается в глобальном контексте окна.