在研究js模块化写法的时候产生的疑问,代码如下
// 立即执行函数写法,保证外部不能访问到 count
var module1 = (function() {
var count = 0;
var m1 = function() {
return count;
};
return {
m1: m1
};
})();
// 如果现在想给 module1 添加新的方法
module1 = (function(mod) {
mod.m2 = function() {
return count;
}
return mod;
})(module1);
console.log(module1.m1());//可以访问到 count
// console.log(module1.m2());
我想知道为什么 module1.m2()
访问不到 count
?
代言2017-06-12 09:30:08
缕一缕思路:m1之所以能访问到count,是因为m1跟count在同一个function里声明的,也就是他们在同一个作用域下,但是m2所在的function跟count可不是在同一个function作用域下的,也没有存在function嵌function的关系,自然访问不到。
题主是觉得module1本身就跟count在同一个function下,所以给module1加个方法,这个方法就跟count在同一个作用域下?
typecho2017-06-12 09:30:08
因为词法作用域的关系,JS的函数是静态作用域,也就是说函数在定义的时候已经确定了里面变量应该挂载到什么符号,在你内部定义m1的时候,匿名函数返回一个count,这个会在定义的时候确定了是这函数外部的var count=0
。
而在你定义m2的时候,匿名函数返回一个count,这个count的符号查找是先从它定义处内部查有没有,如果没有再查到上一层函数定义处,然后是最外处,也就是全局变量,所以这里的count是个全局变量。
所以module1.m2()访问不到你在m1处定义的count变量,因为静态词法作用域的关系,m2是没办法追到那里面的。