Проблема:
Проблема, которую ставит eval, заключается в том, что он выполняется в глобальной области видимости
eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window
Сценарий:
Предположим, вы используете отдельные атрибуты в коде разметки различных элементов документа, такие как атрибут onvisible
<img src="" onvisible="src='http://www.example.com/myimg.png';">
Вы хотели бы получить все элементы с этим атрибутом, превратить onvisible-content-string в замыкание и поместить его в очередь EventHandler. Здесь вступает в игру конструктор JS Function.
Function === 0..constructor.constructor
>true
Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]
Собираем все вместе:
var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');
for (var el in els) {
var jscode = els[el].getAttribute('onvisible');
eventQueue.push( {el:els[el], cb:Function(jscode)} )
}
//eventQueue[0].cb.call(scope, args);