您的位置:首页 > Web前端 > JavaScript

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教程笔记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript