Javascript 中函数(全局)的含义

Sun*_*nil 3 javascript kendo-ui

我试图了解下面代码中的函数(全局)是什么意思,“ 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);
Run Code Online (Sandbox Code Playgroud)

Edw*_*rzo 7

这段代码中有一些常见的 JavaScript 模式:

  • 命名空间模式。
  • 立即函数模式。

命名空间模式

在浏览器中,window 对象是全局作用域对象。在您共享的这个代码示例中,程序员创建了一个立即调用的函数表达式(IIFE) 并将全局对象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"
Run Code Online (Sandbox Code Playgroud)

如果这段代码没有包含在一个立即函数中,那么变量 days、today 和 msg 都将是全局变量,是初始化代码的剩余部分。