Javascript 函数编程

初涉Javascript ,会以为Javascript 是面向过程的编程语言, 和C类似,使用函数来达成效果。

<!--Add by oscar999-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
<script>
function test()
{alert("ok");
}
</script>
</HEAD><BODY>
<input type=button value="Click" οnclick="test()">
</BODY>
</HTML>

Javascript 对象编程

Javascript 本身是没有类的概念,但是确确实实是面向对象的编程语言。

更多相关请参见:

JavaScript实现类与继承

原型(prototype)可以让你直接给一个变量对象添加属性或是函数。

你也可以用以下方式来定义一个对象:

<script>
var jsobj = {};
jsobj.attr1 = "value1";
</script>

更多相关,请参见:

JavaScript 对象和字串之间的转换

模块化需求

不管是使用以上那种方式编程,js代码编写或导入的方式都是相同的。
或是写在 html 的<srcipt>标记块内,或是独立成js 文件,再导入到页面中。
当页面代码很多的时候,有可能还会拆分成多个js文件来导入。
如此,实际的开发中, 就有可能会遇到一些困扰:
困扰1.  变量值被意外篡改
使用函数化的方式的状况:  有可能我们会定义一些js全局变量, 这个全局变量会就被所有的function 用到, 如果这些function 本身又使用了同名的变量。我们知道,js 的变量无须定义就可以使用,最后,那个全局变量的值是什么,就真的很难知道和控制了。
使用对象的方式的状况: 对象内定义的属性和方法对外部来说都是可以获取和改变的, 这个对象也就没有私有变量之说了。而且,如果不同的js 中定义了同名的对象,就会出现覆盖的状况。对于开发和调试的困扰比较大。
困扰2. js 导入附带的问题
拆分成多个js导入,可能这些js直接有先后和依赖关系,顺序不对,有可能导致问题。
困扰3. 导入的文件量较大,页面载入较慢
现在的web开发,伴随着Ajax技术的盛行, 同一个页面需要展现的功能较多,很多时候都是局部的替换,更新,隐藏/展现功能。如此,单个页面的需要导入的js文件的量势必非常大。而这些文件是从服务端传输过来的。

模块化解决探求

针对这些问题,如何寻求一种比较好的解决方式?

  • 立即执行函数解决困扰1
<!--Add by oscar999-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
<script>var module1 = (function(){var _v1 = 0;var func1 = function(){alert("this is func1")};var func2 = function(){alert("this is func2")};return {"func1":func1,"func2":func2};
}());module1.func1();</script>
</HEAD><BODY></BODY>
</HTML>

通过以上方式, module1对象里的属性 _v1 就无法访问了。私有变量得以保护。

关于立即执行函数的介绍可以参考:

JS 立即执行的函数表达式(function)写法

  • 使用带入参数方式解决困扰2(也称为放大模式, augmentation)
<!--Add by oscar999-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
<script>var module1 = (function(){var _v1 = 0;var func1 = function(){alert("this is func1")};var func2 = function(){alert("this is func2")};return {"func1":func1,"func2":func2};
}());var module2 = (function(mod){mod.func3 = function(){alert("this is func3")}
}(module1));module1.func3();</script>
</HEAD><BODY></BODY>
</HTML>

看以上代码, module2 是在module1 之上进行的扩展。
如果module2执行时, module1尚未准备好,就要使用宽放大模式了。

<!--Add by oscar999-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
<script>var module2 = (function(mod){mod.func3 = function(){alert("this is func3")}
}(module1||{}));var module1 = (function(){var _v1 = 0;var func1 = function(){alert("this is func1")};var func2 = function(){alert("this is func2")};return {"func1":func1,"func2":func2};
}());</script>
</HEAD><BODY></BODY>
</HTML>

总结

此篇仅为抛砖引玉,介绍模块化动机的探讨和方案的预设, 在目前这个 js library 丰富的时代, 已经有一些很好的library 可以直接使用帮我们达成模块化的效果。
在此篇之后的后续章节会详细介绍

Javascript模块化编程系列一: 模块化的驱动相关推荐

  1. Javascript模块化编程系列二: 模块化的标准化(CommonJS AMD)

    前言 Javascript模块化编程系列一: 模块化的驱动 在前一篇介绍了为什么要进行Javascript模块化编程.至于如何实现模块化,不同的开发组织和个人具体的实现方式肯定是不一样.如何统一一个规 ...

  2. keil c语言模块化编程,keil C模块化编程总结

    昨晚看了下模块化编程的东西,把自己的工程整了整,可惜没成功.今早发神经似的起床敲代码,很快就发现了错误,原来是条件宏定义的头文件名忘改了,汗!!! 整理下模块化编程的要点,感谢以下三位UP主的帖子: ...

  3. Javascript模块化编程系列三: CommonJS AMD 模块化规范描述

    CommonJS Module 规范 CommonJS 的模块化规范描述在Modules/1.1.1 中 目前实现此规格的包有: Yabble,CouchDB,Narwhal (0.2), Wakan ...

  4. javascript异步编程系列【一】----用Jscex画圆

    一.简介 关注老赵的jscex很久了,jscex利用eval(str)的无限可能,从"$async" 到"async",从不支持if else 等 到支持 if ...

  5. javascript异步编程系列【八】--Jscex版火拼俄罗斯

    一.简介 俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名.俄罗斯方块的基本规则是移动.旋转和摆放游戏自动输出 ...

  6. C语言模块化编程的例子

    以往写C语言程序都是一个文件里面写个几十.几百行,在练算法的时候还可以,现在搞开发需要模块化编程,所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一 ...

  7. 蓝桥杯单片机按键模块化编程

    按键 一.按键电路 1.矩阵按键 将J5的KBD接在一起,使用矩阵按键.就是1.2接在一起. 现在8个I/O口控制16个按键.P34,P35,P42,P44控制四列,单片机通过这四个I/O输出高低电平 ...

  8. 单片机零基础入门(9-1)实战:模块化编程(模块化两个案例含源码--以及无法显示头文件(.h)的解决方案)

    单片机零基础入门(9-1)实战:模块化编程-(以及无法显示头文件(.h)的解决方案) 本文作为单片机零基础入门(8-5)模块化编程的拓展和补充,比前面的单片机零基础入门(8-5)模块化编程更为详细. ...

  9. python一入深似海-模块化编程-钢铁侠战甲

    文章目录 模块化编程--钢铁侠战甲 函数 函数的作用? 函数的定义和使用 函数的特征及注意事项 函数的参数 函数参数大类分为形参和实参: 函数返回值 return返回值的特征 变量作用域 模块化编程- ...

最新文章

  1. Linux下的Shell编程(2)环境变量和局部变量
  2. C++继承中的构造与析构
  3. golang select default continue_Go并发(四):select篇
  4. SAP gateway standard mode和compatible mode的区别
  5. RHEL AS 5 安装MYSQL
  6. Mac安装yaf扩展
  7. mysql 中文脱敏_怎样选择数据库脱敏系统?
  8. 使用SQL管理数据库
  9. matlab 黄金分析,优化算法之黄金分割算法-Matlab-站长-站长头条
  10. MyBatis配置文件
  11. HOW2J.CN - 学习笔记(类和对象)
  12. 捕鱼游戏源码(数值+完整项目资源)
  13. 工作流程管理系统,表结构与运行机制
  14. mysql dba 工资,好大夫高级mysql dba工资待遇怎么样 - 好大夫在线 - 职友集
  15. oracle 数据字典画报,1 Oracle常用数据字典表
  16. 长安大学 计算机专业分数线,2018长安大学录取分数线 历年分数线及专业排名
  17. ajax用formdata,ajax用FormData方式提交
  18. 微观经济学第三周作业(价格弹性,供给与需求)
  19. AtomicReference原子类
  20. CADD分子对接、薛定谔分子对接、AMBER分子动力学能量优化与分析、AIDD人工智能(机器学习与深度学习)药物发现

热门文章

  1. 循序渐进学习嵌入式开发技术
  2. 编写HTML代码常见错误以及解决方法?
  3. python虚拟环境解决不能执行脚本的问题
  4. 基于知识图谱的推荐系统总结
  5. 【白皮书分享】智能文字识别(OCR)能力评测与应用白皮书.pdf(附下载链接)...
  6. 【报告分享】斯坦福-2019人工智能指数年度报告.pdf(附293页报告现在链接)
  7. 【报告分享】2019年中国人工智能商业落地研究报告.pdf(附下载链接)
  8. IJCAI 2019 | 为推荐系统生成高质量的文本解释:基于互注意力机制的多任务学习模型...
  9. duri oracle 连接字符串_C#连接Oracle数据库的连接字符串
  10. python刷leetcode_零基础python刷leetcode -- 1. Two Sum