网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 javascript创建命名空间的5种写法
内容
    在javascript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子:
    代码如下:
    var sayhello = function() {
      return 'hello var';
    };
    >function sayhello(name) {
      return 'hello function';
    };
    >sayhello();
    最终的输出为
    代码如下:
    > hello var
    为什么会这样,根据 stackoverflow 的解释,实际上javascript的是按如下顺序解析的。
    代码如下:
    function sayhello(name) {
      return 'hello function';
    };
    var sayhello = function() {
      return 'hello var';
    };
    sayhello();
    不带var的function声明被提前解析了,因此现代的js写法建议你始终使用前置var声明所有变量;
    避免全局变量名冲突的最好办法还是创建命名空间,下面是在js中合建命名空间的几种常用方法。
    一、通过函数(function)创建
    这是一种比较常见的写法,通过声明一个function实现,函数里设置初始变量,公共方法写入prototype,如:
    代码如下:
    var namespace = namespace || {};
    /*
    function
    */
    namespace.hello = function() {
      this.name = 'world';
    };
    namespace.hello.prototype.sayhello = function(_name) {
      return 'hello ' + (_name || this.name);
    };
    var hello = new namespace.hello();
    hello.sayhello();
    这种写法比较冗长,不利于压缩代码(jquery使用fn代替prototype),而且调用前需要先实例化(new)。使用object写成json形式可以写得紧凑些:
    二、通过json对象创建object
    代码如下:
    /*
    object
    */
    var namespace = namespace || {};
    namespace.hello = {
        name: 'world'
      , sayhello: function(_name) {
        return 'hello ' + (_name || this.name);
      }
    };
    调用
    代码如下:
    namespace.hello.sayhello('js');
    > hello js;
    这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。
    三、通过闭包(closure)和object实现
    在闭包中声明好所有变量和方法,并通过一个json object返回公有接口:
    代码如下:
    var namespace = namespace || {};
    namespace.hello = (function() {
      //待返回的公有对象
      var self = {};
      //私有变量或方法
      var name = 'world';
      //公有方法或变量
      self.sayhello = function(_name) {
        return 'hello ' + (_name || name);
      };
      //返回的公有对象
      return self;
    }());
    四、object和闭包的改进型写法
    上个例子在内部对公有方法的调用也需要添加self,如:self.sayhello(); 这里可以最后再返回所有公有接口(方法/变量)的json对象。
    代码如下:
    var namespace = namespace || {};
    namespace.hello = (function() {
      var name = 'world';
      var sayhello = function(_name) {
        return 'hello ' + (_name || name);
      };
      return {
        sayhello: sayhello
      };
    }());
    五、function的简洁写法
    这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自stackoverflow:
    代码如下:
    var namespace = namespace || {};
    namespace.hello = new function() {
      var self = this;
      var name = 'world';
      self.sayhello = function(_name) {
        return 'hello ' + (_name || name);
      };
    };
    欢迎补充。
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/20 4:08:30