我想了解 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);
答案 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都是全局变量, 剩余的来自初始化代码。