作用域
先说一下什么是作用域,作用域就是代码作用生效的区域,作用域分为两种,全局作用域和局部作用域。
全局作用域:在整个区域内,都有效。不属于任何一个函数的区域,叫全局作用域
局部作用域:初步认识中只要是在函数中的,就是一个局部的区域,叫局部作用域
全局变量:指在全局作用域中的变量,全局变量在当前代码内的任何区域都可以拿到。全局变量随着程序的执行一直存在。
局部变量:指在局部作用域中的变量,局部变量只能在当前所在的局部作用域中使用。它在局部作用域的开始时被创建,结束时被删除。可以说的上是朝生暮死。
变量的访问规则:
父作用域不能拿子作用域中的变量
function fn(){
var a = 10;//声明一个变量并赋值
console.log(a);//运行结果为10
}
fn();//运行函数
console.log(a);//运行结果为报错,因为在父作用域中并没有变量a的存在
子作用域却可以使用父作用域中的变量
var a = 10;//声明一个变量并赋值
console.log(a);//运行结果为10
function fn(){
console.log(a);//运行结果也为10,因为子作用域可以使用父作用域中的变量
}
fn();//运行函数
拓展
function box(){
var a = 10;//声明并赋值
var b = 10;//声明并赋值
var c;//声明但不赋值
function fn(){
var a = 20; //再次声明再次赋值
b = 20; //不声明只再次赋值
var c = 20; //再次声明并赋值
console.log(a); // 运行结果为20,再次声明赋值会影响局部变量的值,但不会影响父作用域中变量的值。
console.log(b); // 运行结果为20,不声明只赋值会同时改变局部作用域和全局作用域中变量的值。
console.log(c); //运行结果为20,再次声明赋值会影响局部变量的值,但不会影响父作用域中变量的值。
}
fn();
console.log(a); // 运行结果为10,父作用域中并不能调用子作用域的值,所以还为10.
console.log(b); // 运行结果为20,同上。
console.log(c); //运行结果为undefined,同上。
}
box();//运行函数
综上所述,在局部作用域中声明赋值并不影响父作用域中原变量的值,但是不声明只赋值的话会影响到父作用域中变量的值。
ps:1.函数等同于变量,也存在全局和局部,所以这次我们拿函数来举例子。
2.作用域这个知识点可以用来优化代码