JavaScript作用域提升问题分析
2016-07-13 13:47
495 查看
如果经常编写Java, C++的工程师一定知道作用域的问题,同时,作用域也是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。
简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
var authorName="山边小溪"; function doSomething(){ var blogName="梦想天空"; function innerSay(){ alert(blogName); } innerSay(); } alert(authorName); //山边小溪 alert(blogName); //脚本错误 doSomething(); //梦想天空 innerSay() //脚本错误
上面代码中, 最外层函数和在最外层函数外面定义的变量拥有全局作用域。
function doSomething(){ var authorName="山边小溪"; blogName="梦想天空"; alert(authorName); } doSomething(); //山边小溪 alert(blogName); //梦想天空 alert(authorName); //脚本错误
所有末定义直接赋值的变量自动声明为拥有全局作用域。
ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。对于作用域提升的问题,我们来看一个实例:
var tmp = new Date(); function f() { console.log(tmp); if (false) { var tmp = "hello world"; } } f(); // undefined
上面代码中,内层变量可能会覆盖外层变量,作用域提升。
var s = 'hello'; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
上面代码中,变量i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
解决作用域提升的问题,我们在ES6中会有let, const作为解决方案,更多参考ES6教程笔记。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解