803笔记(作用域)
事件和函数的关系
box.innerHTML=nine();
//通过js给div元素添加内容 函数的返回值
一个变量只声明不赋值,值是undefined,类型也是undefined(不是报错)
var a
console.log(a)
没有声明变量,直接使用变量——报错
console.log(b)
没有var的话不是全局变量,只有在第一次赋值的时候才能使用
console.log(a) //undefined
var a=10
--------------
console.log(a) //报错
a=10
console.log(a) //10
函数里的变量没有写var的话,使用的是外面的值,外部可以直接使用,这时候就不是局部作用域,而也是全局作用域
在函数中声明变量不加var,就是全局变量
练习:九九乘法表
作用域(变量提升)
就是作用的范围
全局作用域:函数外定义的变量,在页面的任何地方都可以使用
局部作用域:函数内定义的变量,只能在函数内使用
代码一旦进入作用域,就启动js解析器
1、在作用域中寻找一些东西:var function(调用不提前,正常按顺序执行) 形参(实质上指的是函数调用) ,找到就把他们提到前面
2、逐行解读代码
——执行表达式
——函数调用
1:预解析
2:逐行解读代码
1.执行表达式
2.逐行解读代码
alert(a);
var a =1;
alert(a);
function fn(){
alert(2);
}
——————————————————————
//找到var提到前面,就是将var后面的变量名提取出来,并给他初始化一个值undefined
var a;
function fn(){
alert(2)
}
//再逐行解读代码
alert(a); //undefined
var a=1;
alert(a); //1
//最终输出结果是undefined 1
这叫做变量的提升
函数里面也会有预解析,然后逐行解读执行
alert(a);
var a =1; //提前
alert(a);
function fn(){ //提前
alert(2);
}
var a=2;
alert(a);
function(a){
alert(3)
}
var a=3
alert(a);
---------------------
var a //undefined
function fn(){
alert(2);
}
function(a){
alert(3)
}
当变量和函数同名时,丢变量保函数
alert(a); //得到的是function a(){alert(3);}
var a =1; //提前变量
alert(a); //1
function fn(){ //提前
alert(2);
}
var a=2;
alert(a); //2
function(a){
alert(3)
}
var a=3
alert(a); //3
当有多个script标签时,从上到下依次解析并执行第一个script标签,然后下一个,依次类推
在上面script中声明的东西,下面的script中都可以使用
在下面script中声明的东西,上面使用都会报错
alert(a)
function fn(){
alert(2)
}
<script>
var a=1
fn()
</script>
----------------
function fn(){
alert(2)
}
var a=1
alert(a) //报错,a is not defined,因为a是在下面的标签里定义的
<script>
var a=1
fn() //正常调用
</script>
形参(形参是局部作用域)
alert(a); //undefined
var a =1;
alert(a); //1
function fn(){
alert(a); //undefined
var a =2;
alert(a); //2
}
fn();
alert(a); //1
--------------------提前
var a
function fn(){
alert(a); //undefined
var a =2;
alert(a); //2
}
alert(a); //undefined
var a =1;
alert(a); //1
function fn(){
alert(a); //undefined
a =2;
alert(a); //2
}
fn();
alert(a);
————————————————————————————————提前
var a //undefined
function fn(){
alert(a); //1
var a =2;
alert(a); //2
}
alert(a); //undefined
var a =1; //全局作用域
alert(a); //1
function fn(){
alert(a); //1
a =2; //函数里没写var 这里的a作为全局变量,全局的a值都改变
alert(a); //2
}
fn();
alert(a); //2
//函数里的变量没有写var的话,使用的是外面的值,外部可以直接使用,这时候就不是局部作用域,而也是全局作用域
//在函数中声明变量不加var,就是全局变量
作用域链:如果当前作用域中没有,则向父级作用域查找,如果还没有,继续向父级作用域查找,一直找到全局作用域。如果也没有,则报错。
alert(a)
var a=1
alert(a)
function fn(a){
alert(a)
a=2
alert(a)
}
fn(a)
alert(a)
----------------------
var a //undefined
function fn(a){ //形参也是局部作用域
a=2
alert(a)
}
alert(a) //undefined
var a=1
alert(a) //1
function fn(a){ //形参也是局部作用域,类似于var a=1;
alert(a) //1
a=2
alert(a) //2
}1
fn(a)
alert(a) //1
浙公网安备 33010602011771号