javascript学习(八)— 变量、作用域、常量
来源:互联网 发布:新闻联播动画制作软件 编辑:程序博客网 时间:2024/05/29 01:54
全局作用域
不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性:
'use strict';var course = 'Learn JavaScript';alert(course); // 'Learn JavaScript'alert(window.course); // 'Learn JavaScript'
因此,直接访问全局变量course和访问window.course是完全一样的。
你可能猜到了,由于函数定义有两种方式,以变量方式var foo = function () {}定义的函数实际上也是一个全局变量,因此,顶层函数的定义也被视为一个全局变量,并绑定到window对象:
'use strict';function foo() { alert('foo');}foo(); // 直接调用foo()window.foo(); // 通过window.foo()调用
进一步大胆地猜测,我们每次直接调用的alert()函数其实也是window的一个变量:
'use strict';window.alert('调用window.alert()');// 把alert保存到另一个变量:var old_alert = window.alert;// 给alert赋一个新函数:window.alert = function () {}alert('无法用alert()显示了!');// 恢复alert:window.alert = old_alert;alert('又可以用alert()了!');
这说明JavaScript实际上只有一个全局作用域。任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报ReferenceError错误。
名字空间
全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。
减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如:
// 唯一的全局变量MYAPP:var MYAPP = {};// 其他变量:MYAPP.name = 'myapp';MYAPP.version = 1.0;// 其他函数:MYAPP.foo = function () { return 'foo';};
把自己的代码全部放入唯一的名字空间MYAPP中,会大大减少全局变量冲突的可能。
许多著名的JavaScript库都是这么干的:jQuery,YUI,underscore等等。
局部作用域
由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的
'use strict';function foo() { for (var i=0; i<100; i++) { // } i += 100; // 仍然可以引用变量i}foo();
为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:
'use strict';function foo() { var sum = 0; for (let i=0; i<100; i++) { sum += i; } i += 1; // SyntaxError(变量i出了for循环之后无法被使用)}foo();
常量
由于var和let申明的是变量,如果要申明一个常量,在ES6之前是不行的,我们通常用全部大写的变量来表示“这是一个常量,不要修改它的值”:
ES6标准引入了新的关键字const来定义常量,const与let都具有块级作用域:
'use strict';const PI = 3.14;PI = 3; // 某些浏览器不报错,但是无效果!PI; // 3.14
修改使用const定义的申明的变量会报出错误:SyntaxError: redeclaration of const PI
- javascript学习(八)— 变量、作用域、常量
- python学习系列(八)变量作用域
- 变量作用域(JavaScript)
- javascript学习——块作用域和私有变量
- JavaScript学习——变量的作用域
- 《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用
- 《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用
- JavaScript学习(二)之变量、作用域和内存
- JavaScript学习笔记九:变量作用域
- JavaScript高级程序设计学习笔记——变量、作用域和内存问题(重要)
- JavaScript基础学习笔记(三)——变量、作用域、内存
- JavaScript 变量作用域
- javascript 变量作用域
- javascript变量作用域
- JavaScript变量作用域
- Javascript 变量作用域
- JavaScript变量作用域
- Javascript 变量作用域
- oracle帮助文档——Globalization Support Guide
- GCD 常用的几个方法
- MySQL存储引擎之Spider内核深度解析
- java 获取某个包下的所有类名
- Ubuntu下修改键盘排列
- javascript学习(八)— 变量、作用域、常量
- oracle帮助文档——DBA's Guide
- RNN生成音乐
- PHP学习路线图---千锋PHP出品
- Cocoapods 创建私有库
- openwrt 透明代理上网
- vuex浅析
- 二维数组中的查找
- Python中 sys.argv[]的用法简明解释