代码之家  ›  专栏  ›  技术社区  ›  mellowsoon

javascript:这个代码是做什么的?

  •  7
  • mellowsoon  · 技术社区  · 14 年前

    如果这个问题太宽泛,我提前道歉。事实上,这是4个不同的问题,但都与同一段代码有关,我认为它们都围绕着相同的原则。

    在使用JS多年后,我今天决定真正开始学习JS的工作原理,而不是像对待在浏览器中运行的C那样对待它。所以我开始深入研究jquery代码,以了解真正的JS开发人员如何使用langauge。这时我发现了一块代码,看起来像下面的代码。注意,我把这个代码从另一个堆积的帖子上取了下来。 In Javascript, can you extend the DOM? . 所以这并不意味着写这段代码的人甚至知道他在说什么。

    var myDOM = (function(){ // #1
        var myDOM = function(elems){ // #2
                return new MyDOMConstruct(elems);
            },
            MyDOMConstruct = function(elems) {
                this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems];
                return this; // #3
            };
        myDOM.fn = MyDOMConstruct.prototype = {
            forEach : function(fn) {
                var elems = this.collection;
                for (var i = 0, l = elems.length; i < l; i++) {
                    fn( elems[i], i );
                }
                return this;
            },
            addStyles : function(styles) {
                var elems = this.collection;
                for (var i = 0, l = elems.length; i < l; i++) {
                    for (var prop in styles) {
                        elems[i].style[prop] = styles[prop];
                    }
                }
                return this;
            }
        };
        return myDOM; // #4
    })();
    

    1为什么使用var mydom=(function())()而不是var mydom=function()声明函数

    2为什么要申报 另一个 mydom函数内部的函数是否具有完全相同的名称?为什么不把所有内部mydom的逻辑放在外部mydom函数中呢?

    3为什么明确地返回“this”?那应该是自动完成的,对吗?

    4这是怎么回事?它是否返回内部mydom的构造函数?如果是,为什么?

    更新

    所以现在大部分都是有意义的。关于1,我认为mydom被分配了在诳之后定义的函数,但它不是。它被分配给函数返回的任何内容。恰好是一个函数。

    我还是不清楚。是的,我理解使用这样的函数

    console.log(MyDomConstruct('foo'))
    

    将显示“未定义”。但这不是它的使用方式。这是几排吗

    return new MyDomConstruct(elems);
    

    我可以理解,如果声明是这样的话,明确地返回“this”

    return MyDomConstruct(elems);
    

    但事实并非如此。

    5 回复  |  直到 14 年前
        1
  •  9
  •   jAndy    14 年前

    为什么使用var mydom=(function())()而不是var mydom=function()声明函数?

    这就是所谓的 self-invoking anonymous function self-executing anonymous function . 它就是这样做的,它在运行时调用自己。您还将看到模式:

    (function($){
    }(jQuery));
    

    在jquery世界中相当多。同样,在运行时,函数调用自身并保证 $ 符号引用了 jQuery 函数体中的对象。

    在代码段中,函数调用自身并返回 myDOM ,函数引用。

    为什么在mydom函数内部声明另一个同名的函数?为什么不把所有内部mydom的逻辑放在外部mydom函数中呢?

    那只是一个惯例。它可以被称为任何你想它是,也许作者认为这是方便的做这件事。这种模式的原因是隐私和安全。通过返回内部 米多姆 参考A closure 创建。所以在宣布

    var mytest = myDOM([]);
    

    您将无法访问 MyDOMConstruct 但是你的内部功能是可以访问的。这样就可以保护方法和变量。它也被称为 method pattern . 在这种情况下总是读得很好 Douglas Crockford: Javascript the good parts .

    为什么要明确地返回“this”?那应该是自动完成的,对吗?

    不,函数将返回 undefined 默认值。通过显式返回 this 你可以 chain 方法如下(来自上面的示例调用):

    mytest.forEach([]).addStyles([]); ...
    

    因为每个方法都返回调用对象,在本例中 米多姆 .

    这是怎么回事?它是否返回内部mydom的构造函数?如果是,为什么?

    我希望在这一点上可以澄清。

    编辑

    根据您的更新:

    new MyDOMConstruct();
    

    生成一个新对象 inherits

    MyDOMConstruct.prototype
    

    没有 new keyword 这个 不会绑定到新对象。相反,它将绑定到全局对象(窗口),您可以使用 .

        2
  •  6
  •   Peter Ajtai    14 年前

    1。为什么使用 var myDOM = (function() {})(); 而不是 var myDOM = function() {};

    使用的窗体是一个自执行函数。这意味着mydom被设置为函数返回的任何值。第二个表单将mydom设置为函数,但不会立即执行函数。

    var myDOM = (function() {           // <== This is a function that does something
                    // Something
                })();                 // The function is executed right HERE with ().
    


    2。为什么在mydom函数内部声明另一个同名的函数?为什么不把所有内部mydom的逻辑放在外部mydom函数中呢?

    因为您将在末尾返回内部mydom函数….因此,尽管命名一开始令人困惑,但实际上还是有意义的。这通常用于在JS中创建私有变量。由于内部函数将可以访问其所包含的作用域(自执行匿名函数),但用户不会访问。

    var myDOM = (function() {  // <== This is a function that is going to return 
                               // a function / object
                    var myDOM = function() { // <== We're going to return this
                        ...                  //     The outer myDom will be set to it
                    };                       //     So it's actually helpful to name
                                             //     it the same for clarity.
                    return myDOM;
                })();
    
    // Now we can access that inner object by using the outer myDOM.
    // We could access the inner object using myDOM even if the inner object
    //   was named otherTHING... It's confusing to acces something
    //   called otherTHING in the code by
    //   writing myDOM().... so better name the inner returned function
    //   myDOM as well.
    

    所以内部对象可以命名为任何东西,并且可以用 myDOM() ,但如果命名内部函数 blah 但是您仍然可以使用 MyMDOM() …不太清楚…最好用同样的名字命名。

    三。为什么要明确地返回“this”?那应该是自动完成的,对吗?

    不,如果你不写任何东西,javascript会自动返回 undefined . 这个 MDC reference: .

    返回 this 通常用于保存方法的上下文。它用来链接方法( $(here).is().a().chain().of().methods() 可能。这样,链下的一个方法就知道了它所操作的上下文。

        3
  •  3
  •   nre    14 年前

    只需再给 自执行匿名函数 . 在一个 (function() { })(); 块是创建私有命名空间的一种方法。您在内部函数中所做的一切都将是函数私有的,除了返回的值(在本例中 myDOM )

    那就是你可以节省下来做一些像

    var counter = (function() {
       var i = 0;
       var counter = function() {
          alert(i++);
          return i;
       }
       return counter;
    })();
    
    counter(); // will alert 0
    counter(); // will alert 1
    // ... and so on
    

    使某些内部状态的秘密远离功能的外部。第二个原因是,正如其他文章中所述,它不会用变量污染全局命名空间。 i . 这就是为什么在jquery插件开发中使用这些函数是最佳实践的原因。

        4
  •  1
  •   user257319    14 年前

    与此相同:

    
    (function () {
        function b(a) {
            return new c(a)
        }
        function c(a) {
            this.a = a[1] ? Array.prototype.slice.call(a) : [a];
            return this
        }
        b.b = c.prototype = {};
        return b
    })();
    

    希望有帮助…:)

        5
  •  1
  •   Dragoon zhang    14 年前

    例如: var fn=(函数()。{ 返回函数()警报(11) }); 当代码运行时,现在fn=function()alert(11) 试试看!!!!