Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中函数(全局)的含义_Javascript_Kendo Ui - Fatal编程技术网

Javascript中函数(全局)的含义

Javascript中函数(全局)的含义,javascript,kendo-ui,Javascript,Kendo Ui,我试图理解函数(全局)在下面的代码中的含义,“窗口”是传递给函数的参数值还是它的参数名而不是参数值 可能这是一个简单的JavaScript,使用了一种不同寻常的编码风格 (function (global) { var mobileSkin = "", app = global.app = global.app || {}; app.application = new kendo.mobile.Application(document.body,

我试图理解函数(全局)在下面的代码中的含义,“窗口”是传递给函数的参数值还是它的参数名而不是参数值

可能这是一个简单的JavaScript,使用了一种不同寻常的编码风格

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

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

  • 名称空间模式
  • 即时功能模式
名称空间模式

在浏览器中,窗口对象是全局范围对象。在您共享的这个代码示例中,程序员创建了一个(IIFE)并将全局对象
窗口
作为参数传递,在IIFE的上下文中,它绑定到局部变量
全局

正如其名称所示,当浏览器解析此文件时,会立即调用该函数

从这一点开始,
global
只是全局范围对象
window
的别名,程序员使用它在其中定义名称空间
app

名称空间基本上避免了将全局范围与需要定义的对象混为一谈,并允许程序员更准确地控制在其自定义范围内定义的内容

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

他在书中解释如下:

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

JavaScript没有在语言语法中内置名称空间,但是 这是一个很容易实现的特性。而不是污染 包含许多函数、对象和其他对象的全局范围 变量,您可以为其创建一个(理想情况下只有一个)全局对象 您的应用程序或库。然后,您可以将所有功能添加到 那个物体

立即调用的函数模式

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

斯特凡诺夫将其重要性描述如下:

此模式非常有用,因为它为您的 初始化代码。考虑以下常见场景:您的 当页面加载时,代码必须执行一些设置任务,例如 附加事件处理程序、创建对象等。所有这些工作 只需执行一次,因此没有理由创建可重用的 命名函数。但是代码也需要一些临时变量, 在初始化阶段完成后,您将不需要它。信息技术 将所有这些变量创建为全局变量是个坏主意。那是 为什么需要一个立即函数将所有代码包装到其本地 在全局范围内不泄漏任何变量:

(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都是全局变量, 初始化代码的剩余部分


很好的解释。我感谢你详细的回答。这是什么意思:app=global.app=global.app | |{};?坦白地说,它非常混乱,对我来说就像一门新语言。从右到左解释它。此部分
global.app |{}
计算结果为
global.app
的值(如果存在),否则计算结果为新对象。该值是分配给
global.app
变量的值,为方便起见,将其别名为
app
。最后一部分可能有点过头了,因为该对象已经可以在全局范围内以该名称访问。好的。这就清楚了。谢谢。我觉得写简单的代码比写这么复杂的代码要好。更简单的代码更易于维护,开发/交付速度更快。