• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >AngularJS > 使用AngularJS编写较为优美的JavaScript代码指南

使用AngularJS编写较为优美的JavaScript代码指南

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-30

本文主要包含使用AngularJS编写较为优美的JavaScript代码指南等相关知识,希望在学习及工作中可以帮助到您

本文示例代码下载:modulePattern.zip - 所有的 4 个 HTML 文件  以及 panacea.js - 1.6 KB

介绍

 AngularJS 的库里面有很多东西,但本文中我只想专注于小的,针对特定主题的库,我相信通过它们能对Angular有一个较好的介绍.  理解这篇文章并不需要你有任何Angular相关的,甚至是JavaScript的经验。希望你能从本文中看到一些使用Angular的好处,并乐于动手尝试.
背景

我使用Angular有一段时间了,而在学习Angular的时候,我也喜欢构建一些样例,所以当我一开始深入进去的时候,对于模块或者JavaScript的设计模式,我也没有多想,那样对保持代码组织和条理性有帮助.  那就是所有的重点:保持代码的组织和条理性.  因此,现在我回过头来,创建了这个极其小巧的样例,以展示使用模块可以有多简单.  一路走来,我希望它能够成为一篇好的对Angular的介绍.

(大多数)文章在阐述模式时的问题

大多数时候人们都会尝试去在读者知道模式是啥概念之前就开始阐述一个模式,而这基本上误导了每一个人.  这里要努力使得本文尽量简单,让我们首先来看一看这个问题吧。哪个问题呢?就是有关默认会在全局内存空间被创建的所有东西的Javascript的问题.

下面就是我所说的意思.
JavaScript 默认的全局问题

设想你的HTML中有下面这样一段脚本.
 

<script>
   var isDoingWork = false;
</script>
</div>

范围?

你清楚这个变量的范围么?
是的,它是全局的。这个布尔值实际上被添加到了浏览器的全局窗口对象中. 

把它设置到Action中

这里你可以看到它在Action中是怎样的.

  •     下载本文的代码样例.
  •     在你的浏览器中打开 modulePattern.htm .
  •     打开浏览器开发工具 -- F12(Chrome, IE) or Ctrl-Shift-I (Opera) -- (那样就可以看见控制台了)
  •     在浏览器工具控制台下,输入: isDoingWork,然后回车<ENTER>
  •     你会看到输出的值为false.
  •     现在输入 : isDoingWork = true,然后回车<ENTER>
  •     如此下载的值就为true了. 你已经改变了这个值.
  •     你可以看到这个值已经通过输入doingwindow.isDoingWork = true然后回车<ENTER>,被添加到了全局窗口对象之中.

这可能会造成一些名字冲突,也会导致一些严重的bug. 这也许对你而言有点杞人忧天了,是不?  但是请设想你是决定要去实现某一个新的JS库,它每分每秒都可以被创建出来.  假设你发现了这个叫做 Panacea.js 的很棒的库,它将解决你所有的问题.

因此你向下面这样在你的页面中引用了它:
 

<script src="panacea.js"></script>
</div>

如此简单,你就已经解决之前你遇到的所有问题. 然而,因为它是一个庞大的库,而你只想要解决方法,却不回去深挖这个庞大(几千行代码)源文件里的每一行代码.  而深埋在 Panacea.js 里面某个角落的确实下面这样的代码:
 

var isDoingWork = false;
 
setInterval(function(){isDoingWork = !isDoingWork;}, 3000);
</div>

这代码真是酷,你知道吗?

每个3秒,它都会将这个布尔值设置成相对的值。啊!

自己动手看看

如果你想要自己动手验证下这个东西,你可以做下面这几步:

  •     下载本文的样例代码.
  •     在你的浏览器中打开 modulePattern2.htm .
  •     打开浏览器开发工具 -- F12(Chrome, IE) 或者 Ctrl-Shift-I (Opera) -- (这样你就可以看到控制台了)
  •     在浏览器开发工具的控制台下,输入 : isDoingWork 然后回车<ENTER>
  •     将第4步多重复几次,你将会发现isDoingWork的值会每个大约3秒钟变化一次.

那这是不是很棒呢?
我的第一个观点 : 模块模式是很有用的

我需要为此做出解释,为了要向你展示为什么 JavaScript 的模块模式是很有用的.  我得想你展示 JavaScript 的模块模式,那样我就可以告诉你它是如何在AngularJS中被使用或实现的了. 
 
模块模式:封装

如此,实际就是,模块模式基本上就是封装了.  封装听起来很熟悉,如果你有点面向对象编程经历的话 -- 而我也希望你能有点这个经验.  封装是面向对象编程的三原则之一。封装的另外一个说法就是数据隐藏。在经典的面向对象编程中——它不同于JavaScript所依赖的原型化OOP -- 数据隐藏是构建一个类模板的内在组成部分.

例如在 C#中, Animal 类的封装 -- 隐藏数据 -- 特定的值被关联到Animal对象. 那样,如果某人决定变更那些值,他或他必须明确的通过初始化一个Animal对象并设置这个对象的值来达到目的.  在JavaScript中,我们则可以随意的在全局窗口对象中设置值.

 

public class Animal
 
{
   // constructor allows user to set the commonName
   public animal(string name)
   {
    this.commonName = name;
   }
   // making commonName private hides (encapsulates) it in the class
   private string commonName;
   //explicitly exposing the value for reading only
   public string CommonName get { return this.commonName  }
}
</div>

在JavaScript中,模块已经被创建用来模拟这种封装行为了,如此我们就不会去将我们的变量组织到一个全局的命名空间中,并造成了隐藏很深的难以被发现和修复的问题.

现在你知道为什么了,让我们来看看如何会是这样的.

函数被立即调用的表达式(IIFE)

看上去就好像每次我们向前推进一步,我们都要走点旁门左道.  因为要获得能让我们创建模块模式的JavaScript语法,我们就得去了解一种叫做函数被立即调用的表达式语法,也叫做IIFE ( IIFE 发音是 "iffy").

最基础的 IIFE 看起来像这样:
 

(function(){
  // lines
  // of
  // code
}());
</div>

如果你从来没有看到过像这样的东西,那你就有点说不过去了.
立即被调用

首先,这个名称的第一部分叫做立即被调用的原因是,一般包含这个特殊函数的源文件被加载好了,那么包含在这个函数中的代码就会运行. 
 
对IIFE语法更加仔细的观察

你可以看到这个语法的最中心是一个函数。看一下这个代码块,我已经将代码分段并将一些行标上了号,如此我们就可以探讨它了.
 

( // 1.
  function() //2.
  { // 3.
   // 一行一行
   // 的
   // 代码
  }() // 4.
); // 5.
</div>

首先,看看上面脚本的第2行。这一行通常看来就是一个匿名(也就是没有命名)的函数声明.  而后,第3一直到第4则是这个函数的主题部分。最后,第4行最后以一对括弧结束,这对 括弧会告诉JavaScript解释器去调用这个函数。最终, 所有这些都会被包在一个不归属任何部分的括弧(第1和第5行)中, 而这对括弧会告诉解释器要调用这个外部的匿名函数,它包含了我们所定义的函数.


IIFE 可以带上参数

这段奇怪的语法会在带上参数之后,看起来会更加的奇怪.  它看起来会像是下面这样
 

(function(thing1, thing2){
  // lines
  // of
  // code
}("in string", 382));
</div>

现在,你可以看到这个函数可以带上两个会被内部的函数引用的thing1, thing2参数.  被传入值,在示例中是 "in string" 和 382.

现在我们理解了IIFE语法,让我们来创建另外一个代码示例,我们将运行这段代码来看看封装是如何运作的.
 

(function(){
  var isDoingWork = false;
  console.log("isDoingWork value : " + isDoingWork);
}());
</div>

自己动手看看

为了看看是怎么运行的,你可以做下面这几步:

  •     下载本文的源代码.
  •     在你的浏览器中打开 modulePattern3.htm.
  •     打开浏览器的开发工具 -- F12(Chrome, IE) 或者 Ctrl-Shift-I (Opera) -- (这样你就

您可能想查找下面的文章:

相关文章

  • 2017-05-30利用JavaScript的AngularJS库制作电子名片的方法
  • 2017-05-30angular十大常见问题
  • 2017-05-30ANGULARJS中用NG-BIND指令实现单向绑定的例子
  • 2017-05-30AngularJS控制器之间的数据共享及通信详解
  • 2017-05-30使用ngView配合AngularJS应用实现动画效果的方法
  • 2017-05-30Angular2从搭建环境到开发步骤详解
  • 2017-05-30Angular.js去除页面中显示的空行方法示例
  • 2017-05-30详解Angular 4.x NgIf 的用法
  • 2017-05-30AngularJS ng-bind-template 指令详解
  • 2017-05-30Angular学习笔记之angular的$filter服务浅析

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • AngularJS中的模块详解
    • angular.bind使用心得
    • 详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
    • AngularJS中实现显示或隐藏动画效果的方式总结
    • 浅析webapp框架AngularUI的demo
    • SeaJS 与 RequireJS 的差异对比
    • ANGULARJS中用NG-BIND指令实现单向绑定的例子
    • AngularJS包括详解及示例代码
    • AngularJS 模块详解及简单实例
    • AngularJS监听路由变化的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有