您的位置:首页 > Web前端 > JavaScript

JavaScript作用域

2017-04-09 16:29 253 查看
学习JavaScript中,作用域算是比较重要的一块,因为比较抽象,所以很多人都难免模模糊糊,包括我自己也是这样
所以我自己写下了自己的理解,如果有什么不对的,请指出谢谢..
js解析顺序和作用域 js的解析顺序是按照作用域来读取代码
那么什么是作用域呢,JavaScript本身就是一个最大的作用域,

每一个函数执行的时候都会产生一个作用域.

很多人认为js的解析顺序是从上到下的,这是错误的

举个例子: var a =10;

alert(a);

代码会弹出10,

alert(a);

var a=10;

这时候会弹出一个undefined,而不是报错,说明什么,说明里面已经有一个变量a,但是没有赋值

每一个域里面代码的解析顺序:

1.定义: 找var (只会找出变量名,但是并不会执行后面的赋值)

找function;

2.执行: 从上往下执行代码;


 我们在来看看作用域

 我们来看一个例子

 <script> 

var a=10;//全局变量 

</script>

 <script>

alert(a)

</script>

结果却显示可以弹出结果,按理说两个域之间是不可以相互跨越的 .

但 var a相当于window.a ,也就是全局变量, 

相当于定义在window对象下.

那么我们在举个例子 ,

 var a=0;

function mun(){var b=50; }

这个是全局变量么 ,答案肯定不是 ,上面已经说到每个函数都有一个自己的域,

而这个b 的作用域就是这个函数

而a是在script声明的,所以他是全局变量.. 

 作用域链 : 

举一个例子:

var a=10; 

 Fn();

a=20; 

function Fn()

{ var b=20; alert(a); alert(b);

}

执行顺序 

1: 定义: 找变量 var a 

 找函数体 function Fn(){ 

 var b=20; 

alert(a); 

alert(b); 

} 

 2:执行: 

 a=10;

Fn()==>执行函数,进入Fn()作用域 ====>1:定义 var b 

 2: 执行: 

 b=20;

alert(a);//最终弹出10 

 alert(b) //最终弹出20 

 在来看一个例子:

var a=10; 

var b=15;

Fn();

a=20; 

function Fn(){

 var a=5; 

 b=20;

alert(a); 

 alert(b); 

 } 

alert(a); 

 alert(b); 

解析顺序: 

 1. 找变量var a;

var b;

 找函数体 function Fn(){

var a=5;

b=20;

alert(a); 

 alert(b) 

}

 2.执行 a=10;

 b=15;

 Fn(); ====> 1.var a

 2. a=5; 

 b=20;

 alert(a)//5

 alert(b)//20=====>返回父级作用域 (script)

 a=20; 

alert(a); //20

 alert(b) //20

 注意:函数里面的 b=20;

 没有var 所以他是全局变量window.b

所以在全局的b=15 被重新赋值为20; 

下面的几个例子我就不写顺序了 ...

var x=5;

 a(); 

 function a(){

alert(x);//undefined; var x=10; 

 }

 alert(x); //5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息