我偶然发现了这段代码:
function isolate(win, fn) {
var name = '__lord_isolate';
var iso = win[name];
if (!iso) {
var doc = win.document;
var head = document.head;
var script = doc.createElement('script');
script.type = 'text/javascript';
script.text = 'function ' + name + '(f){new Function("window","("+f+")(window)")(window)}';
head.insertBefore(script, head.firstChild);
head.removeChild(script);
iso = win[name];
}
iso ? iso(fn) : new Function("window", "(" + fn + ")(window)")(win);
}
这与自我调用功能不一样吗?使用它有什么好处吗?
感谢。
答案 0 :(得分:1)
这与自我调用函数不一样吗?
它根本不能与立即调用的函数表达式相比。但它仍然与看似相同的
有点不同function isolate(win, fn) {
fn(win);
}
因为它会对fn
进行字符串化并重新评估它,从而破坏过程中的所有闭包。
使用它有什么好处吗?
是的,它允许您将功能放在不同的全局范围内。如果您有多个浏览上下文(例如iframe,制表符等),则每个浏览上下文都有自己的全局范围和全局对象。通过插入带有内容的脚本
function __lord_isolate(f) {
new Function("window", "("+f+")(window)")(window);
}
他们正在创建一个iso
函数,它将在给定的f
全局上下文中评估和调用函数win
。
当然,这更像是一个黑客而不是一个解决方案(甚至不能在任何地方工作)而不是一个好的做法,但有时可能会有必要。
答案 1 :(得分:0)
该函数的名称是isolate,它不是自我调用的。使用自调用功能有好处。例如,它对初始化非常有用。