2012-07-06 108 views
0

我在javascript.I新手读过与SAEF的文章,而我仍然有问题,代码如下:
SAEF中的参数是什么意思?

var addEvent = (function(window, document) { 
    if (document.addEventListener) { 
     return function (elem, type, callback) { 
      //if elem exist and is a single node. 
      if (elem && !elem.length || elem === window) { 
       elem.addEventListener(type, callback, false); 
      } else if (elem && elem.length) { //elem is an node of array 
       for (var i = 0; i < elem.length; i++) { 
        addEvent(elem[i], type, callback); 
       } 
      } 
     } 
    } else if (document.attachEvent) { 
     return function (elem, type, callback) { 
      //if elem exist and is a single node 
      if (elem && !elem.length || elem === window) { 
       elem.attachEvent('on'+type, 
        function() { 
         callback.call(elem, window.event); 
       }); 
      } else if (elem && elem.length){ 
       for (var i = 0; i < elem.length; i++) { 
        addEvent(elem[i], type, callback); 
       } 
      } 
     } 
    } 
})(this, document); 
我的问题是什么呢这和文件意味着帕拉姆都是他们的?真正的参数将取代匿名函数中包含的窗口和文档的参数?

回答

0

这是一种称为立即函数的JavaScript模式。它的形式如下:

(function(param1, param2, ...) { 
    /* ... function body ... */ 
}(var1, var2)); 

你是对的,它涉及创建一个匿名函数,然后用一组变量来调用它。

它允许开发人员创建没有变量泄漏的范围。 JavaScript只有全局和函数范围。任何在函数体外声明的变量都会自动在Global范围内。

直接函数可以避免这个问题。

在这种情况下,与许多情况下一样,immediate函数将返回包含闭包内部某些内部变量的东西。这可以保护它们,但可以保护它们的值。

在这种情况下,您将返回一个允许调用者将事件添加到HTML元素的函数。您通常会看到用于创建跨浏览器方法的立即函数。对直接函数的调用将执行所有浏览器方法嗅探,然后生成适当的跨浏览器方法。这意味着嗅探只能完成一次。这样每次调用该方法时都可以避免嗅探浏览器。

+0

感谢您的回答,Dancrumb.I现在明白了。 – Tristan 2012-07-07 01:13:10