代码之家  ›  专栏  ›  技术社区  ›  Jack Clark

当封装在IIFE中时,javascript库如何可用?执行上下文是否已释放?

  •  2
  • Jack Clark  · 技术社区  · 8 年前

    在Undercore js库中,所有代码都包装在里面:

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

    我理解将function()包装在()中是出于名称空间的目的,而.call(this)在启动时通过窗口对象调用库。

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

    问题已经得到回答,但它在我脑海中提出了这个问题:

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

    var library1 = function(
         var func1 = function(){ 
    
         }; 
      return { 
         func1: func1 
      })(this);
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Rahul Arora    8 年前

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

    //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,因此即使您想获得库代码之外的窗口对象的值,也可以很容易地获得。

    自从 你好

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

    了解执行上下文

    执行上下文仅在调用特定函数或使用某个变量/对象时生成。

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

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