欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

变量的作用域

程序员文章站 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)}
  1. 预解析 在没有正式解读代码之前的操作
    找var,找到后提前赋予一个值undefined,找function,找到后提前赋予一个值整个函数
    如果解析到的函数和变量重名,保留函数
  2. 逐行解读代码
    如果遇到表达式,会改变变量的值
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);

相关标签: 变量的作用域