函数作用域与块级作用域
函数作用域:在函数内部声明的变量只能影响到变量所在函数体本身,无法从外部对函数内部的变量进行调用,被称为‘函数作用域’
块级作用域:ES6 引入了 let 和 const 关键字,JavaScript 也有了块级作用域。当代码块中存在 let 或 const,这个代码块就成为了块级作用域。ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。(即定义变量和使用变量只能在同一个{}里)
var,let,const的区别
var
var没有块级作用域,有函数作用域。
代码1:
window.onload=function(){
if(1){
var a=1;
}
console.log(a);
}
效果1:
代码2:
function A(){
var a=1;
}
window.onload=function(){
A();
console.log(a);
}
效果2:
代码3:
<script>
window.onload=function(){
var a=1;
A();
function A(){
console.log(a);
}
}
</script>
效果3:
可见在大函数中定义的变量对大函数中的小函数也有效果。
let
let只能在块级作用域中使用。
代码1:
window.onload=function(){
if(1){
let a=1;
}
console.log(a);
}
效果1:
代码2:
function A(){
let a=1;
console.log(a);
}
window.onload=function(){
A();
}
效果2:
const
const只在块级作用域内有效,并且声明变量需要立马赋值并不可改变变量值
代码1:
window.onload=function(){
if(1){
const a=1;
}
console.log(a);
}
效果1:
代码2:
function A(){
const a=1;
console.log(a);
}
window.onload=function(){
A();
}
效果2:
代码3:
function A(){
const a=1;
const a=4;
console.log(a);
}
window.onload=function(){
A();
}
效果3:
补充:全局作用域
声明全局变量的方法:
- 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量。
- 直接给变量明赋值
- window.变量名=变量值
代码:
var a=1;
function A(){
function B(){
console.log(a);
b=2;
window.c=3
}
B();
}
window.onload=function(){
A();
console.log(b);
console.log(c);
}
效果:
参考文章:
块级作用域
全局,函数,块级作用域的区别
JS中声明全局变量
函数作用域