Javascript 了解下划线.js代码的结构

Javascript 了解下划线.js代码的结构,javascript,underscore.js,Javascript,Underscore.js,我在和许多其他开源JavaScript项目中看到了这种模式: (function() { // the library code }).call(this); 有人能解释这种模式的作用吗?使用它的好处是什么 为什么不只是: (function() { // the library code }()); 如果您碰巧同时运行多个版本的下划线,那么这可能与noConflict功能有关 此(窗口)被传入,以便它可以检测现有版本的。。使用此符号可以避免硬引用窗口,这很好。还有一些较小的性能优势:局

我在和许多其他开源JavaScript项目中看到了这种模式:

(function() {
 // the library code
}).call(this);
有人能解释这种模式的作用吗?使用它的好处是什么

为什么不只是:

(function() {
 // the library code
}());

如果您碰巧同时运行多个版本的下划线,那么这可能与
noConflict
功能有关

窗口
)被传入,以便它可以检测现有版本的
。使用此符号可以避免硬引用
窗口
,这很好。还有一些较小的性能优势:局部范围内的变量解析速度更快

替代办法可以是:

(function () {
    // library
}(window)); // hard reference to window (not so nice)

(function () {
    // library
}({})); // this will break `noConflict` detection

这是将整个代码包装在一个匿名函数中。这样,函数中声明的变量将保持私有,因此其他脚本将无法访问您的代码

调用是一种函数方法。它将使用传递的参数作为
this
的值来调用匿名函数

在这种情况下,
的值在默认情况下是
窗口
对象,它将在匿名函数中提供,以供访问。这里有一个例子

(function(a, b, c ){ // and other arguments
    // Here `this` will refer to document object.

    // And the variables declared here are compltly private

    // If you want any variable to make global use window object

    var someStuff = 'scret'; // Private

    function Lib(){
        return someStuff.length;
    }

    window.Lib = Lib; // This will be available to other scripts

}).call(document, a, b, c);

这种包装器通常由预处理器语言生成,如

,因为它们在正常上下文中是等效的。我查看了源代码,它在2年前从您建议的形式更改为当前形式,并带有以下签入注释:

“添加了与Adobe JS兼容的全局上下文的显式定义”

带有此更改的第一版下划线的签入日志声称“改进了下划线与Adobe JS引擎的兼容性,可用于编写Illustrator、Photoshop和friends脚本。”

版本1.4.3

因此,做出这一更改似乎是因为Adobe的JavaScript引擎当时不符合ES3或ES5,但通过这一更改,下划线与它们的变体兼容


如果您不打算在AdobeJS中运行模块,那么您可以使用任何一种形式。如果是,则Adobe JS似乎需要下划线使用的格式。

第一部分:

var x = 1; // `x` is in the global scope

(function() {
 var y = x; // `y` is in the current function's scope
}());

x = y; // Here `x` becomes `undefined` because `y` is not declared in this "outer" scope
至于“为什么””——这是一种避免麻烦的简单技术(没有“内存泄漏”[函数结束时所有内部声明的变量都是无效的],没有声明冲突等)

第二部分: 至于(也有类似的)版本,这只是上下文的问题。
作者希望匿名函数(上面的函数)的上下文将其
this
指向外部范围的相同
this


希望很清楚:)

它将函数内部的
设置为与函数外部的
相同。(这通常是全局运行的,因此
窗口
),这并不能解释它,因为对于underline.js,
在两种情况下都是相同的。