作用域
- 两个不同的script标签,先执行完前一个的全部代码,再往下,前一个里面定义了的变量,后面的就可以使用.
- script是最大的域.
函数执行就是一个域.
js解析过程
- 定义:
var 定义变量. 只定义变量名.
function(){}定义,找出函数整体. - 执行:
除了定义 , 都是执行 , 从上往下.
例子
<script type="text/javascript">
alert( a );
var a = '阿';
alert( a );
/*
1.定义
var a;
2.执行
alert( a );//undefined
a = '阿';
alert( a );//阿
*/
</script>
<script type="text/javascript">
fn();
function fn(){
alert('HELLO!');
};
/*
1.定义
function fn(){
alert('HELLO!');
};
2.执行
fn();
*/
</script>
作用域的判断:
- 每个函数执行时,会产生一个新的作用域 .
- 每遇到一个作用域,都会重新开始 定义和执行 .
作用域链:
- 每一个作用域,当要找某个变量或者函数时,先从自身找,自身没有的话,往上找(父或爷-作用域);
- 一直都找不到的话,报错;
- 只能从子作用域往父作用域找,不能父作用域往子作用域找 .
<script type="text/javascript">
var x = 5;
a();
function a(){
alert( x );
var x = 10;
};
alert( x );
/*
1.定义:
var x;
function a(){
alert( x );
var x = 10;
};
2.执行:
x = 5;
a(); ===> 1.定义:
var x;
2.执行:
alert( x ); //undefined
x = 10;
alert( x ); // 5
*/
</script>
函数和var变量同名的时候,函数为准:
<script type="text/javascript">
function a(){
alert( 1 );
};
var a;
alert( a );//函数块--无关顺序
</script>
<script type="text/javascript">
var a = 10;
alert( a );
a();
function a(){
alert( 20 );
};
/*
1.定义:
function a(){
alert( 20 );
};
2.执行:
a = 10; //赋值
alert( a ); //10
a(); //数字加括号,报错
*/
</script>