javascript 库在包含在 IIFE 中时如何可用?执行上下文不是被释放了吗?
How are javascript libraries available when wrapped in an IIFE? Isn't the execution context disposed?
在 Underscore js 库中,所有代码都包含在里面:
(function() {
//rest of library etc.
}.call(this));
我知道将 function() 包装在 () 中是出于命名空间的目的,并且 .call(this) 在启动时调用库并传递 window 对象。
但我的理解是,一旦执行上下文完成 运行,它就是 'deleted'。那么这个库中的所有代码如何可供其他脚本文件使用?
问题已得到解答,但它在我脑海中提出了这个问题:
现在这对我来说很有意义。该函数被执行并将其库附加到 window 对象上。
但是,当使用这种方法时,如果库将相同的对象名称附加到 window 对象,它们可能会相互覆盖。
做这样的事情不是更好吗:
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 函数绑定到 window 对象,因此可以在库代码之外调用它。
这适用于绑定到 window 对象的任何函数或变量。
了解执行上下文
执行上下文仅在调用特定函数或使用某些变量/对象时创建。
对于每个被调用的函数,都会创建一个不同的执行上下文,并在执行完成时将其丢弃。这并不意味着在这种情况下对象 (window) 将不再是内存的一部分。
您可以使用不同的参数调用一个函数 10 次,它将创建 10 个不同的执行上下文,这些执行上下文在运行时分配内存并在执行完成后销毁它。与加载的库代码无关
在 Underscore js 库中,所有代码都包含在里面:
(function() {
//rest of library etc.
}.call(this));
我知道将 function() 包装在 () 中是出于命名空间的目的,并且 .call(this) 在启动时调用库并传递 window 对象。
但我的理解是,一旦执行上下文完成 运行,它就是 'deleted'。那么这个库中的所有代码如何可供其他脚本文件使用?
问题已得到解答,但它在我脑海中提出了这个问题:
现在这对我来说很有意义。该函数被执行并将其库附加到 window 对象上。 但是,当使用这种方法时,如果库将相同的对象名称附加到 window 对象,它们可能会相互覆盖。
做这样的事情不是更好吗:
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 函数绑定到 window 对象,因此可以在库代码之外调用它。
这适用于绑定到 window 对象的任何函数或变量。
了解执行上下文
执行上下文仅在调用特定函数或使用某些变量/对象时创建。
对于每个被调用的函数,都会创建一个不同的执行上下文,并在执行完成时将其丢弃。这并不意味着在这种情况下对象 (window) 将不再是内存的一部分。
您可以使用不同的参数调用一个函数 10 次,它将创建 10 个不同的执行上下文,这些执行上下文在运行时分配内存并在执行完成后销毁它。与加载的库代码无关