<script>
var out = "var_global";
function scope(){
console.log(out);
var out = "var_local";
}
</script>
//...为什么是测试后输出的是 undefined 的
<script>
var out = "var_global";
function scope(){
console.log(out);
var out = "var_local";
}
</script>
//...为什么是测试后输出的是 undefined 的
当开始运行 scope 函数时候, 先识别到out声明.但此时,out并没有被赋值.然后函数开始真正运行的时候,先打印,自然是underfined.(函数内部声明了out,会在函数体内的活动变量中覆盖函数外的out)
声明提前
var out = "var_global";
function scope(){
var out;//undefined
console.log(out);
out = "var_local";
}
题主的问题是函数作用域。因为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;
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
首先楼主这段代码和javascript里面的变量闭包环境作用域是没有任何关系的,这个是声明的变量前置,所以运行的时候代码是变成
而你说的闭包环境作用域,这个是说闭包中返回的函数能够继续引用其父函数的变量,是两个概念