在IIFE中包装时,javascript库是如何可用的?处理执行上下文是不是已经处理好了?

时间:2016-06-30 13:29:51

标签: javascript underscore.js iife

在Underscore js库中,所有代码都包含在内:

(function() {  
     //rest of library etc.
}.call(this));

我知道在()中包装function()用于命名空间,并且.call(this)在启动时调用库传递窗口对象。

但我的理解是,一旦执行上下文运行完毕,它就会被删除'。那么这个库中的所有代码如何用于其他脚本文件?

问题已得到解答,但它提出了这个问题:

这对我来说很有意义。该函数被执行并将其库附加到窗口对象上。 但是,当使用此方法时,如果将相同的对象名称附加到窗口对象,则库可以相互覆盖。

不喜欢做类似的事情:

var library1 = function(
     var func1 = function(){ 

     }; 
  return { 
     func1: func1 
  })(this);

1 个答案:

答案 0 :(得分:2)

这个概念可以用一个简单的例子来解释:

//library code starts
(function(){

    this.hello = function(){
        console.log("asd");
    }

}).call(this);
//library code ends


//outside the library
//will print the function showing that it is available outside the library
console.log(window.hello); //will print the function
console.log(hello); 

//will console.log hello
hello();

由于call函数使用this调用IIFE(指向window对象),即使你想在库代码之外获取window对象的值,你也可以轻松获得它。

由于 hello 函数被绑定到window对象,因此可以在库代码之外调用它。

这适用于绑定到窗口对象的任何函数或变量。

了解执行背景

只有在调用特定函数或使用某个变量/对象时才会执行执行上下文。

对于每个被调用的函数,创建一个不同的执行上下文,在执行完成时将其处理掉。这并不意味着在这种情况下对象(窗口)将不再是内存的一部分。

您可以使用不同的参数调用函数10次,它将创建10个不同的执行上下文,在运行时分配内存并在执行完成后销毁它。它与正在加载的库代码无关。