您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

JavaScript命名空间常用方法

时间:2019-08-21 10:01:20  来源:  作者:

很多学习前端开发的小伙伴都会遇到这样的问题:在JAVAScript中全局变量经常会引起命名冲突,甚至有时侯重写变量不是按照想像中的顺序来。避免全局变量名冲突的最好办法还是创建命名空间,接下来千锋广州Web培训老师就给大家分享在JavaScript中创建命名空间的几种常用方法。

JavaScript的执行环境由各种各样的全局变量构成,这些全局变量先于函数执行环境而创建、这些全局变量都挂载于“全局对象”下。当名称有冲突时就会产生一些不可控的问题,比如命名冲突、代码的脆弱性、难以测试等。

前端开发入门知识:JavaScript命名空间常用方法

 

​在编程开发中合理的使用命名空间可以避免相同的变量或对象名称产生的冲突,而且命名空间也有助于组织代码有更强的可维护性和可读性。JavaScript中虽然没有提供原生的命名空间支持,但我们可以使用其他的方法(对象和闭包)实现类似的效果。

1、单一全局变量

JavaScript中一个流行的命名空间模式是选择一个全局变量作为主要的引用对象,因为每个可能的全局变量都成为唯一全局变量的属性,也就不用再创建多个全局变量,也就避免了和其他声明的冲突。不过单一全局变量模式已经在不少的JavaScript类库中使用,如:YUI定义了唯一的YUI全局对象,jQuery定义了$和jQuery,$由其他类库使用时使用jQuery等。示例如下:

var myApplication = (function() {

function() {

// ***

},

return {

// **

}

})();

2、命名空间前缀

命名空间前缀模式其思路非常清晰,就是选择一个独特的命名空间,然后在其后面声明声明变量、方法和对象。示例如下:

var = myApplication_propertyA = {};

var = myApplication_propertyA = {};

function myApplication_myMethod() {

// ***

}

从某种程度上来说,它确实减少了命名冲突的发生概率,但其并没有减少全局变量的数目,在使用这种模式时一定要特别注意。

3、对象字面量表示法

对象字面量模式可以认为是包含一组键值对的对象,每一对键和值由冒号分隔,键也可以是代码新的命名空间。示例如下:

var myApplication = {

// 可以很容易的为对象字面量定义功能

getInfo:function() {

// ***

},

// 可以进一步支撑对象命名空间

models:{},

views:{

pages:{}

},

collections:{}

};

对象字面量为我们提供了优雅的键/值语法,我们可以非常便捷的组织代码封装不同的逻辑或功能,而且可读性、可维护性、可扩展性极强。

4、嵌套命名空间

嵌套命名空间模式可以说是对象字面量模式的升级版、它也是一种有效的避免冲突模式、因为即使一个命名空间存在、它也不太可能拥有同样的嵌套子对象、示例如下:

var myApplication = myApplication || {};

// 定义嵌套子对象

myApplication.routers = myApplication.routers || {};

myApplication.routers.test = myApplication.routers.test || {};

当然、我们也可以选择声明新的嵌套命名空间或属性作为索引属性、如:

myApplication[´routers´] = myApplication[´routers´] || {};

使用嵌套命名空间模式可以使代码易读且有组织性,而且相对安全、不易产生冲突,其弱点是如果我们的命名空间嵌套过多会增加浏览器的查询工作量。

5、立即调用的函数表达式

立即调用函数(IIFE)实际上就是匿名函数,被定义后立即被调用。IIFE是用于封装应用程序逻辑的常用方法,以保护它免受全局名称空间的影响。示例如下:

// 命名空间和undefined作为参数传递,确保:

// 1.命名空间可以在局部修改,不重写函数外部上下文

// 2.undefined 的参数值是确保undefined,避免ES5规范里定义的undefined

(function (namespace, undefined) {

// 私有属性

var foo = "foo";

bar = "bar";

// 公有方法和属性

namespace.foobar = "foobar";

namespace.sayHello = function () {

say("Hello World!");

};

// 私有方法

function say(str) {

console.log("You said:" str);

};

})(window.namespace = window.namespace || {});

可扩展性是任何可伸缩命名空间模式的关键,使用IIFE可以轻松实现这一目的,我们可以再次使用IIFE给命名空间添加更多的功能。

6、命名空间注入

命名空间注入是IIFE的另一个变体,从函数包装器内部为一个特定的命名空间“注入”方法和属性,使用this作为命名空间代理,这种模式的优点是可以将功能行为应用到多个对象或命名空间。示例如下:

var myApplication = myApplication || {};

myApplication.utils = {};

(function () {

var value = 5;

this.getValue = function () {

return value;

}

// 定义新的子命名空间

this.tools = {};

}).apply(myApplication.utils);

(function () {

this.diagnose = function () {

return "diagnose";

}

}).apply(myApplication.utils.tools);

// 同样的方式在普通的IIFE上扩展功能,仅仅将上下文作为参数传递并修改,而不是仅仅使用this,如果你经常被全局变量冲突困扰,一定要牢记JavaScript命名空间知识点。



Tags:JavaScript命名   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
很多学习前端开发的小伙伴都会遇到这样的问题:在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量不是按照想像中的顺序来。避免全局变量名冲突的最好办法还是创建...【详细内容】
2019-08-21  Tags: JavaScript命名  点击:(221)  评论:(0)  加入收藏
▌简易百科推荐
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === 'a') { b = true} else { b = false}// goodb = a === 'a'2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Mason程    Tags:JavaScript   点击:(6)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  未来讲IT    Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
1. 检测一个对象是不是纯对象,检测数据类型// 检测数据类型的方法封装(function () { var getProto = Object.getPrototypeOf; // 获取实列的原型对象。 var class2type =...【详细内容】
2021-12-08  前端明明    Tags:js   点击:(23)  评论:(0)  加入收藏
作者:一川来源:前端万有引力 1 写在前面Javascript中的apply、call、bind方法是前端代码开发中相当重要的概念,并且与this的指向密切相关。本篇文章我们将深入探讨这个关键词的...【详细内容】
2021-12-06  Nodejs开发    Tags:Javascript   点击:(19)  评论:(0)  加入收藏
概述DOM全称Document Object Model,即文档对象模型。是HTML和XML文档的编程接口,DOM将文档(HTML或XML)描绘成一个多节点构成的结构。使用JavaScript可以改变文档的结构、样式和...【详细内容】
2021-11-16  海人为记    Tags:DOM模型   点击:(35)  评论:(0)  加入收藏
入口函数 /*js加载完成事件*/ window.onload=function(){ console.log("页面和资源完全加载完毕"); } /*jQuery的ready函数*/ $(document).ready(function(){ co...【详细内容】
2021-11-12  codercyh的开发日记    Tags:jQuery   点击:(36)  评论:(0)  加入收藏
一、判断是否IE浏览器(支持判断IE11与edge)function IEVersion() {var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isIE = userAgent.indexOf("comp...【详细内容】
2021-11-02  V面包V    Tags:Javascript   点击:(40)  评论:(0)  加入收藏
Null、Undefined、空检查普通写法: if (username1 !== null || username1 !== undefined || username1 !== '') { let username = username1; }优化后...【详细内容】
2021-10-28  前端掘金    Tags:JavaScript   点击:(51)  评论:(0)  加入收藏
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化...【详细内容】
2021-10-18  前端达人    Tags:JS   点击:(51)  评论:(0)  加入收藏
带有多个条件的 if 语句把多个值放在一个数组中,然后调用数组的 includes 方法。// bad if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") { //logic } // be...【详细内容】
2021-09-27  羲和时代    Tags:JS   点击:(58)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条