隔离函数中的javascript代码

时间:2015-03-17 15:08:24

标签: javascript function

我偶然发现了这段代码:

   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);
    }

这与自我调用功能不一样吗?使用它有什么好处吗?

感谢。

2 个答案:

答案 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,它不是自我调用的。使用自调用功能有好处。例如,它对初始化非常有用。