Почему вы не можете получить доступ к переменным области действия, используя eval
в инструкции with
?
Например:
(function (obj) {
with (obj) {
console.log(a); // prints out obj.a
eval("console.log(a)"); // ReferenceError: a is not defined
}
})({ a: "hello" })
РЕДАКТИРОВАТЬ: как указала знающая CMS, это похоже на ошибку браузера (браузеры, использующие консоль WebKit).
Если кому-то интересно, какую мерзость я пытался придумать, для чего потребуются и «злые» eval
и with
, я пытался увидеть, смогу ли я получить функцию (используемую как обратный вызов), выполняемую в другом контексте, а не в тот, в котором он был определен. И нет, я вероятно (кашель) не буду использовать это нигде.. любопытнее всего.
(function (context,fn) {
with (context)
eval("("+fn+")()");
})({ a: "hello there" }, function () { console.log(a); })
with
. Простой случай:(function (a) { eval("console.log(a)"); })("hello")
тоже не работает. Думаю, я отправлю вопрос, если кто-то еще не захочет. - person Cristian Sanchez   schedule 07.08.2010eval
иwith
: два неприятных вкуса, которые отвратительны вместе! - person bobince   schedule 07.08.2010ReferenceError
с Chrome 5.0.375 - person Christian C. Salvadó   schedule 07.08.2010function testfunc(a) { eval("alert(a)"); } testfunc("hello");
отлично работает в консоли Chrome И консоли Firebug,(function (a) { eval("alert(a)"); })("hello")
работает только в консоли Firebug (скорее всего, из-за контекста вызова) - person David Titarenco   schedule 08.08.2010eval
, кажется, не видит переменные аргументов в функции, когда функция была определена вFunctionExpression
в консоли! Функции, определенныеFunctionDeclaration
или определенные в документе или URL-адресеjavascript:
, не затрагиваются, даже если затем выполняются из консоли. Версия сwith
у меня до сих пор работает даже в консоли, могу только на аргументы сбить. Странная ошибка. - person bobince   schedule 08.08.2010