JavaScript有关作用域和预解析
Posted HzdWwZz"LJF
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript有关作用域和预解析相关的知识,希望对你有一定的参考价值。
作用域:使用范围
全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
除了函数以外,其他的任何位置定义的变量都是全局变量
局部变量:在函数内部定义的变量,是局部变量,外面不能使用
全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存
全局作用域:全局变量的使用范围
局部作用域:局部变量的使用范围
块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;
说明:js没有块级作用域,只有函数除外。
隐式全局变量:声明的变量没有var,就叫隐式全局变量
全局变量是不能被删除的,隐式全局变量是可以被删除的
定义变量使用var是不会被删除的,没有var是可以删除的
函数体的局部变量,外部无法访问,但是隐式全局变量可以被访问
<script>
function f1() {
var number=100;
}
f1();
console.log(number);//Uncaught ReferenceError: number is not defined
function f1() {
number=1000;
}
f1();
console.log(number);//1000
</script>
隐式全局变量可以被删除,全局变量不能被删除
<script>
var num=10;
delete num;
console.log(num);//10
num2=20;
delete num2;
console.log(num2);//Uncaught ReferenceError: num2 is not defined
</script>
作用域链:
<script>
var num=10;
function f1() {
var num=20;
function f2() {
var num=30;
function f3() {
var num=50;
console.log(num);//50
}
f3();
}
f2();
}
f1();
</script>
如果注释掉var num=50; 则会向外部作用域寻找num变量
<script>
var num = 10;
function f1() {
var num = 20;
function f2() {
var num = 30;
function f3() {
//var num=50;
console.log(num);//30
}
f3();
}
f2();
}
f1();
</script>
有关预解析:
预解析:提前解析代码
预解析:发生在解析代码之前
预解析做什么事?
把变量的声明提前了----提前到当前所在的作用域的最上面
函数的声明也会被提前---提前到当前所在的作用域的最上面
比如:
<script>
console.log(num);//结果是undefined
var num=2;
</script>
<script>
f1();//输出"执行了"
function f1() {
console.log("执行了");
}
</script>
<script>
f1();//调用
var num=20;//这个变量的声明会提升到变量使用之前
function f1() {
console.log(num);//结果是undefined
var num=10;
}
</script>
预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
函数中的变量只会提前到函数的作用域中的最前面,不会出去
以上是关于JavaScript有关作用域和预解析的主要内容,如果未能解决你的问题,请参考以下文章