2、Node.js的组成
JavaScript 由三部分组成,ECMAScript,DOM,BOM。
Node.js是由ECMAScript及Node 环境提供的一些附加API组成的,包括文件、网络、路径等等一些更加强大的 API。
JavaScript可以运行在哪里?
浏览器 内核
IE Trident
FireFox Gecko
Chrome WebKit
Safari WebKit
Opera Presto
Edge Chakra
基础语法
所有ECMAScript语法在Node环境中都可以使用。在Node环境下执行代码,使用Node命令执行后缀为.js的文件即可
全局对象global
在浏览器中全局对象是window,在Node中全局对象是global。
Node中全局对象下有以下方法,可以在任何地方使用,global可以省略。
console.log() 在控制台中输出
setTimeout() 设置超时定时器
clearTimeout() 清除超时时定时器
setInterval() 设置间歇定时器
clearInterval() 清除间歇定时器
3、Node.js的模块化开发
(1)JavaScript开发弊端
JavaScript在使用时存在两大问题,文件依赖和命名冲突。
1、污染全局变量
//a.js 文件:
代码语言:javascript复制var test1='aaaaaa';
//b.js 文件
var test1='bbbbbb';
<script>
console.log('test1=' test1);//bbbbbb;
</script>
console test1 输出'bbbbbb';悲剧啊
2、命名冲突
代码语言:javascript复制//a.js 文件:
function fun(){
console.log('this is b');
}
//b.js 文件
function fun(){
console.log('this is b');
}
//main.js 文件
<script src="a.js"></script>
<script src="b.js"></script>
<script>
fun();//this is b;
</script>
小张在a.js定义了fun(),小李在b.js又定义了fun(),a,b被小王引入到main.js,执行fun(),输出this is b;
3、依赖关系
b.js依赖a.js,标签的书写顺序必须是:
代码语言:javascript复制<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>
这样在多人开发的时候很难协调啊,令人头疼的问题。
解决冲突的方法
1、使用java式的命名空间
2、变量前加“_”
3、对象写法
代码语言:javascript复制var module1={
test1:'aaaaaa',
fun:function(){
console.log(this.test1);
}
}
变量和函数封装在对象里面,使用时,调用对象的属性即可:
module1.fun();//aaaaaa
但是这样的写法会暴露所有模块成员,内部状态可以被外部改写,
module1.test1='cccccc';
4、匿名闭包函数
代码语言:javascript复制var module1=(function(){
var test1='aaaaaa';
var fun=function(){
console.log('this is a');
}
return{
fun:fun
}
}());
匿名函数有自己的作用域,这样外部代码无法读取 module1 function 里面的变量了,从而也不会修改变量或者是覆盖同名变量了,但是还是有缺陷的,module1这个的变量还是暴露到全局了,而去随着模块的增多,全局变量会越来越多。
5、全局引入
像jquery库使用的全局引入。和匿名闭包函数相似,只是传入全局变量的方法不同
代码语言:javascript复制
(function(window){
var test1='aaaaaa';
window.testFun=function(){//通过给window添加属性而暴漏到全局
console.log(test1);
}
}(window));
通过匿名函数包装代码,所依赖的外部变量传给这个函数,在函数内部可以使用这些依赖,然后在函数的最后把模块自身暴漏给window。
3,4,5解决方法都是通过定一个全局变量来把所有的代码包含在一个函数内,由此来创建私有的命名空间和闭包作用域。