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

posted on 2022-08-06 20:57  星野落  阅读(37)  评论(0)    收藏  举报

导航