Странный вывод странного кода

var x = 'outer';
(function() {
  var x = 'inner';
  eval('console.log(x)'); 
  (1,eval)('console.log(x)'); 
})();

выведет

inner
outer

Почему?
Вкратце — судя по всему, eval работает с контекстом корректно только при прямом вызове. А если вызвать его ненапрямую, например

var ev = eval; 
ev('console.log(x)'); 

то и в этом случае контекст сбросится на глобальный.
Тут есть попытки объяснения:
http://stackoverflow.com/questions/19357978/indirect-eval-call-in-strict-mode
http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript

LEAVE A COMMENT