1. 块级作用域
/*这里是全局环境*///立即执行函数(function () { //这里是块级作用域,外部无法读取function内部的变量,除非将变量赋给window var a = 'hello'; var b = 'world'; alert(a); //可以打印a window.b = b; //将b赋给全局})();alert(a); //无法打印aalert(b); //可以打印b
我们一般在写插件的时候,将代码封装在一个立即执行函数里,一般只将一个对象赋给全局供外部使用,这样就避免了插件内部变量污染全局变量。
在多人协作开发的项目中要尽可能少的使用全局变量和函数,否则很可能导致命名冲突。而将各自的代码封装在各自的作用域中,则互不干扰。
//程序员A的代码(function () { $(function () { var a = 'hello'; alert(a); });})();//程序员B的代码(function () { $(function () { var a = 'world'; alert(a); });})();//都得以执行
在全局作用域中使用块级作用域可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。
2. 对于闭包的自我理解
在项目中遇到的代码情况:
(function () { var data = ''; var test = window.test = window.test || {}; test.setData = function () { data = 'The data has been assigned.'; }; test.getData = function () { return data; }; })(); console.log(data); // undefined test.setData(); // 在全局环境给data变量赋值 console.log(test.getData()); // data的作用域在立即执行函数里,但这里可以取到setData所赋的值。
到此我对于闭包的理解是这样的:在全局环境中取不到的块级作用域变量,可以通过块级作用域中的所传递给全局的函数或方法获取到。