变量的作用域
程序员文章站
2024-03-19 13:57:40
...
全局变量
作用范围:整个程序从开始到结束,变量均有效,在函数外面定义的变量(有无var都会是全局的),在函数体内部没有用var定义的变量
var num = 10;
function fn(){
num = 20;
}
fn();
console.log(num)//20,里面的num是隐士的全局变量
var num = 10;
function fn(){
num = 20;
}
console.log(num)//10函数没调用不起作用
局部变量
作用范围:局部变量只在该函数体内部有效,跳出函数体局部变量自动销毁,在函数体内部通过var明确定义的变量,
var num = 10;
function fn(){
var a = 20;
}
fn()
console.log(num,a)//10 , a is not defined此时的a已经自动销毁
var num = 10;
function fn(num){
//相当于var num;//执行完销毁相当于num是局部变量
num = 20;
console.log(num)
}
fn();
console.log(num)//20,10所有的形式参数都是局部变量,跳出函数,形参销毁
var num = 10;
function fn(){
console.log(num)//10找不到向上查找
num = 20;//全局变量
}
fn();
console.log(num)//20
作用域链
变量首先在函数体内部查找,如果在函数体内部查找到,就返回,否则继续向函数体外部查找,查找的过程就是作用域链
js解析器
浏览器如何解析js代码?
在浏览器内部有一个专门解析js代码的程序,叫做js解析器
js解析器如何工作的
alert(a);//undefined
var a = 12;
alert(a);//报错a is not defined
a = 10;
alert(a);//function a(){ console.log(123)}
function a(){
console.log(123)
}
alert(a);//function a(){ console.log(20)}
var a = 10;
function a(){ console.log(20)}
- 预解析 在没有正式解读代码之前的操作
找var,找到后提前赋予一个值undefined,找function,找到后提前赋予一个值整个函数
如果解析到的函数和变量重名,保留函数 - 逐行解读代码
如果遇到表达式,会改变变量的值
alert(a);//预解析 function a(){ console.log(20)}
var a = 10;
alert(a)//10//逐行解读代码 此时解析完成遇到var = 10表达式就改变变量的值
function a(){ console.log(20)}
a()//逐行解读代码 报错 a is not a function, 此时a已经等于10,没有函数a,自然不能调用
练习
alert(a)
var a = 1;
alert(a);
function a(){alert(2);}
alert(a);
var a = 3;
alert(a);
function a(){alert(3);}
alert(a);
上一篇: SpringSecurity
下一篇: Nginx 访问控制 (转)