Почему не может получить доступ к переменным областям с использованием eval
под оператором with
?Как получилось, что eval не имеет доступа к переменным с областью действия под оператором with?
Например:
(function (obj) {
with (obj) {
console.log(a); // prints out obj.a
eval("console.log(a)"); // ReferenceError: a is not defined
}
})({ a: "hello" })
EDIT: Как хорошо осведомленный CMS отметил, это, кажется, браузер ошибка (браузеры, которые используют консоль WebKit).
Если кто-то задавался вопросом, какую мерзость я пытался придумать, это потребует как «зла» eval
, так и with
- Я пытался выяснить, могу ли я получить функцию (использованную как обратный вызов), выполненную в другой контекст, а не тот, в котором он был определен. И нет, я , вероятно, (кашель) не будет использовать это нигде .. более любопытно, чем что-либо.
(function (context,fn) {
with (context)
eval("("+fn+")()");
})({ a: "hello there" }, function() { console.log(a); })
В каком браузере вы получаете такое поведение? Вы используете код на какой-то консоли? – CMS
@CMS: Chrome 5.0.375.125 beta, используя встроенную консоль разработчика. Изменить: я просто попробовал это с Firefox (firebug), и он работал, как ожидалось. Должна быть ошибка браузера, как вы сказали. –
@ Daniel - он работает правильно в Chrome 6.0.472.22, если это помогает любому –