作用域指一个变量作用的范围。
如下代码,
<script>
function fun(){
var a=1;
}
console.log(a);
</script>
报错,因为,a是在函数里,作用域不在函数外。
js有两种作用域:全局作用域和函数作用域
全局作用域
直接编写在script标签中的代码。
在页面打开时创建,关闭时销毁。在全局作用域中有一个全局对象window,可以直接使用。
<script>
console.log(window);
</script>
在全局作用域中,创建的变量都会作为window对象的属性保存。
<script>
var a=10;
console.log(window.a);
console.log(window.b);
</script>
<script>
function fun() {
console.log("我是fun函数");
}
window.fun();
</script>
变量的声明提前
变量
看代码
<script>
console.log(a);
var a=123;
</script>
这里变量声明放在了下面
如果把var去掉会怎样?
<script>
console.log(a);
a=123;
</script>
报错了。
为啥有个var就不会报错呢?
原因:使用var声明的变量,会在所有代码执行之前被声明。(不过赋值则是按代码顺序的,所以结果是undefined)
函数
看代码
fun();
function fun(){
console.log("我是一个fun函数");
}
var fun2 = function(){
console.log("我是fun2函数");
};
fun2();
function fun(){
console.log("我是一个fun函数");
}
var fun2 = function(){
console.log("我是fun2函数");
};
这里报错了,看看fun2存不存在
console.log(fun2);
function fun(){
console.log("我是一个fun函数");
}
var fun2 = function(){
console.log("我是fun2函数");
};
存在,只是是undefined,undefined不是函数,所以报错。
第一种函数创建方法是使用函数声明的方法,它会在所有代码执行之前就被创建,所以调用没有问题。而第二种是创建方法是函数表达式,它只是声明提前,但没有创建函数。
函数作用域
调用函数时创建函数作用域,函数执行完毕后函数作用域销毁。
在函数里可以访问全局变量。
<script>
var a = 10;
function fun(){
console.log(a);
}
fun();
</script>
函数外不能访问函数里的变量。
<script>
var a = 10;
function fun(){
var b = 10;
console.log(a);
}
fun();
console.log(b);
</script>
在函数中访问变量时,会先在函数作用域里找,如果没有才去外部找。
<script>
var a = 10;
function fun(){
var a=50;
console.log(a);
}
fun();
console.log(a);
</script>
这种向外找是一级一级的,比如嵌套了好几个函数,则是往外一层一层找,找到为止,否则报错。
如果想在函数里用全局的变量,要怎么做?
使用window对象。
<script>
var a = 10;
function fun(){
var a=50;
console.log(window.a);
}
fun();
console.log(a);
</script>
如果在函数里修改全局变量的值,会怎样?
<script>
var a = 10;
function fun(){
a=50;
}
fun();
console.log(a);
</script>
所以,函数里可以修改全局的值。
还有一点,函数里没有加var的变量,都是全局变量,而不是函数变量。
<script>
function fun(){
c=50;
}
fun();
console.log(c);
</script>
最后,函数中的形参相当于声明了函数变量,所以不会往函数外找。
<script>
var a=10;
function fun(a){
console.log(a);
}
fun();
</script>