问题:
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);