匿名函数和模块化
2016-10-18 本文已影响91人
GTReload
匿名函数
function outputNum() {
for (var i = 0; i < 5; i++) {
}
alert(i);//5
}
或
function outputNum() {
for (var i = 0; i < 5; i++) {
}
var i;
alert(i);//5
}
在js中,变量在它定义处开始,就可以在函数内部随处访问它,即使重新申明,值也不会改变。
匿名函数可以用来模仿块级作用域避免这问题
//匿名函数申明
(function () {
//这里是块级作用域
})();
下面这种写法报错
function outputNum(count) {
(function () {
for (var i = 0; i < 5; i++) {
}
})();
alert(i);//报错
}
所以,匿名函数一般用在全局作用域中的函数外部,限制向全局作用域中添加过多的变量或函数,从而产生命名冲突污染。
那匿名函数和模块化有什么联系呢?
模块化
模块化定义:如果创建一个对象并以某些数据进行初始化,同时还要公开一些能够访问这些私有数据的方法,就可称为模块化,就像C++/java中的类。
下面展示模块化的几种写法:
- 匿名函数写法:
var Module = (function () {
var count = "abc";
var m1 = function () {
count = count + "m1";
console.log(count);
};
var m2 = function () {
count = count + "m2";
console.log(count);
};
return {
count: count,
m1: m1,
m2: m2
};
})();
- 增强模式
为Module新增m3方法,并返回新的Module对象,这种做法当该对象很大且散落有用。
var Module = (function (mod) {
mod.m3 = function () {
mod.count = mod.count + "m3";
console.log(mod.count);
};
return mod;
})(Module);
- 宽增强模式
当在错综的网路环境中,无法确定哪个先加载,就会导致空对象,这时宽增强模式产生。
var Module = (function (mod) {
mod.m3 = function () {
mod.count = mod.count + "m3";
console.log(mod.count);
};
return mod;
})(window.Module || {});
- 输入全局模式
模块有时是不可能独立存在的,这时需要传入全局变量;另外一种是简化对象操作,例,jQuery传入window,当使用window方法时,无需在输入window.了。
var Module = (function ($,window) {
})(jQuery,window);