Javascript中函数(全局)的含义

时间:2014-03-02 02:18:46

标签: javascript kendo-ui

我想了解 function(global)在下面的代码中是什么意思,并且' window '传递给函数的参数值或者其名称是参数而不是参数值?

这可能是使用不常见的编码风格的简单JavaScript。

(function (global) {
var mobileSkin = "",
    app = global.app = global.app || {};
    app.application = new kendo.mobile.Application(document.body, 
                      { layout: "tabstrip-layout", skin:"flat"});
})(window);

1 个答案:

答案 0 :(得分:4)

此代码中有常见的JavaScript模式:

  • 命名空间模式。
  • 即时功能模式。

命名空间模式

在浏览器中,window对象是全局范围对象。在您共享的此代码示例中,程序员创建了immediately-invoked function expression并将全局对象window作为参数传递,该参数在IIFE的上下文中绑定到局部变量global

当浏览器解析此文件时,会立即调用该函数,顾名思义。

从现在开始,global只是全局范围对象window的别名,程序员使用它来定义命名空间app

命名空间基本上避免了使用您需要定义的对象混淆全局范围,并允许程序员更好地控制其自定义范围内定义的内容。

这个想法是,从现在开始,您应该在此自定义范围内定义所有应用程序全局变量,而不是在窗口全局范围内,这样可以避免与您正在使用的其他第三方库发生名称冲突。这将是Java或C#等其他语言中的包或命名空间的伪等价物。

Stoyan Stefanov在他的书JavaScript Patterns中解释如下:

  

命名空间有助于减少程序所需的全局变量数   同时也有助于避免命名冲突或过度   名称前缀。

     

JavaScript没有在语言语法中内置命名空间,但是   这是一个很容易实现的功能。而不是污染   具有大量功能,对象和其他功能的全局范围   变量,您可以为其创建一个(理想情况下只有一个)全局对象   你的应用程序或库。然后,您可以添加所有功能   那个对象。

即时功能模式

立即调用的函数是另一种常见的JavaScript模式。它只是一个在定义后立即执行的函数。

Stefanov将其重要性描述如下:

  

这种模式非常有用,因为它为您提供了一个范围沙箱   初始化代码。想想以下常见情况:您的   代码必须在页面加载时执行一些设置任务,例如   附加事件处理程序,创建对象等。所有这些工作   只需要进行一次,因此没有理由创建可重用的   命名功能。但是代码也需要一些临时变量,   初始化阶段完成后您将不需要的。它   将所有变量创建为全局变量是个坏主意。那是   为什么你需要一个立即函数 - 将所有代码包装在本地   范围并且不泄漏全局范围内的任何变量:

(function () {
   var days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
   today = new Date(),
   msg = 'Today is ' + days[today.getDay()] + ', ' + today.getDate();
   alert(msg);
}()); // "Today is Fri, 13"
     

如果此代码未包含在立即函数中,那么   变量days,today和msg都是全局变量,   剩余的来自初始化代码。