javascript 里面的变量闭包环境作用域到底是怎么一回事



<script> var out = "var_global"; function scope(){ console.log(out); var out = "var_local"; } </script>

//...为什么是测试后输出的是 undefined 的

阅读 5.9k
7 个回答

首先楼主这段代码和javascript里面的变量闭包环境作用域是没有任何关系的,这个是声明的变量前置,所以运行的时候代码是变成

var out = "var_global";
function scope(){
    var out;//undefined
    console.log(out);
    out = "var_local";
}

而你说的闭包环境作用域,这个是说闭包中返回的函数能够继续引用其父函数的变量,是两个概念

当开始运行 scope 函数时候, 先识别到out声明.但此时,out并没有被赋值.然后函数开始真正运行的时候,先打印,自然是underfined.(函数内部声明了out,会在函数体内的活动变量中覆盖函数外的out)

关键词:变量提升

声明提前

var out = "var_global";
function scope(){
    var out;//undefined
    console.log(out);
    out = "var_local";
}

哈哈 这是我曾经面试别的题,楼上正解 变量提升,js在解析语法树的时候,遇到一些关键字比如var function,再该作用域下会提前被声明。

题主的问题是函数作用域。因为js的变量可以在函数任何一个地方申明(如果在函数内搜索不到就创建为全局变量),但是console.log的时候还没有申明,但是变量在函数作用域内是存在的,所以输出了undefined.

闭包是函数返回一个引用了函数内部变量的函数时保持了那个所引用的变量没有释放,导致整个函数在内存中一直保持。那个被引用的值就是upvalue

js 中函数的执行不是以代码的顺序进行执行的,变量的声明和函数的声明会先先提升。说白了执行的顺序就是:
var out = "var_global";
function scope(){

var out;
console.log(out);
out = "var_local";

}

所以log的时候它会现在scope的作用域中找out这个变量,找到了但是此时out只是声明了并没有初始化所以输出undefined;

推荐问题
宣传栏