JS变量作用域
先明确一点:讨论作用域,讨论的是非对象成员的变量。
一.全局作用域
1.创建具有全局作用域的变量
在函数以及自定义对象之外声明的变量,具有全局作用域
2.具有全局作用域的变量的特性
1.浏览器会创建一个window对象,window的所有属性,都具有全局作用域
2.反过来,具有全局作用域的变量,都是window的属性
<script type="text/javascript">
var a = 3;
{
b = 2;
}
console.log(window.hasOwnProperty("a"));
console.log(window.hasOwnProperty("b"));
console.log(window.hasOwnProperty("c"));
</script>
3.具有全局作用域的变量,任何位置都可以访问
var a = 3;
{
b = 2;
}
console.log(b);
通过上面的两个例子可以看到,JS中,没有代码块作用域。
二.函数作用域
1. 作用于整个函数
函数中使用var关键字声明的变量,在自己的函数对象可见
function func(){
var b = 2;
}
console.log(b);
2. 代码块作用域
代码块中,使用let或const声明的变量,具有代码块作用域
function func(){
{
var a = 1;//作用域是整个func函数
let b = 2;//代码块作用域
const c = 3;//代码块作用域
}
console.log(a);
console.log(b);
console.log(c);
}
func();
由于JS是解释型的语言,访问变量b时出错,就终止了执行,所以没有变量c的报错。
顺便提一句,const修饰的变量只能在初始化时被赋值一次。
三.使用哪一个?
情况一:
var b = 1;
function func(){
var b = 2;
console.log(b);
}
优先使用“自己的”
如果一定要访问,可以这样
var b = 1;
function func(){
var b = 2;
console.log(window.b);
}
因为具有全局作用域的变量,所以可以使用对象来限定
情况二:
var a = 1;
function f1(){
var a = 2;
function f2(){
console.log(a);
}
f2();
}
f1();
优先使用“离自己近的”