javascript - 封装在 IIFE 中的 javascript 库如何可用?执行上下文没有被释放吗?

标签 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);

最佳答案

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

//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(指向window对象)调用IIFE,所以即使你想在库代码之外获取window对象的值,你也可以轻松获取。

由于hello函数绑定(bind)到窗口对象,因此可以在库代码外部调用它。

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

了解执行上下文

仅当调用特定函数或使用某些变量/对象时才会创建执行上下文。

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

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

关于javascript - 封装在 IIFE 中的 javascript 库如何可用?执行上下文没有被释放吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38124618/

相关文章:

javascript - 将 JSON 对象格式化为对象数组

php - 如何使用 $_POST 保存 contentEditable ="true"的 Div?

javascript - View 未使用 require.js 文本呈现!插入

javascript - 在带有一个参数的函数上使用 _.partial

javascript - 在javascript中引用父对象

javascript - 将变量从一个 IIFE 传递到另一个

javascript - javascript 的绑定(bind)方法似乎没有按预期工作

javascript - 逐行解释 JavaScript 函数

javascript - Socket.io/SailsJS 如何订阅除id 以外的属性为true 的实例房间?

javascript - 当对象数组的属性值改变时触发函数