在script标签下直接声明的变量或函数,都会在全局作用域下。可以在程序任何地方拿到
1 <script>
2 var a = "全局变量a"
3 let b = "全局变量b"
4 const c = "全局变量c"
5 </script>也叫局部作用域,如果一个变量是在函数内部声明的,它就处于函数作用域。这些变量只能在函数内部访问,不能在函数以外去访问。
(函数执行完内部变量就会被js销毁,除非使用闭包)
1function aaa(params) {
2 var bb = "bb";
3}
4
5console.log(bb);//bb is not defined只适用于let、const,被这俩关键字定义的变量会产生块级作用域。 大括号之外不能访问,比如if、for循环...
1if (true) {
2 var a = "a";
3 let b = "b";
4 const c = "c";
5}
6
7console.log(a);//"a"
8console.log(b);//b is not defined
9console.log(c);//c is not defined
10在使用一个变量的时候,首先js会先在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域。
1var bb = "bb"; //在这层找到了
2
3(function aaa() {
4 //当前作用域没有,向上层查找
5 console.log(bb);
6})(); //bbjs运行分为两步:预解析,代码执行
预解析优先级:
函数>变量
因为函数提升是整体提升,变量提升不会被赋值,而是执行到那一步才赋值