js作用域及作用域链
作用域
1.全局作用域:一个<script>标签下的区域
*<script>标签在文档位置:script标签可以放在head或body标签中
2.局部作用域:函数体内
*变量:未声明变量初始化为undefined
<script>
//一个script全局作用域 函数内部:局部作用域
//找关键字 function var 第一次出现就储存在域解析里面并且给他初始化undefined
//域解析结果 a=undefined
// var a=10;
console.log(a);//undefined 代表没有生命
var a=10;//a=10;再次赋值
//后声明 undefined字符串
</script>
域解析过程:解析代码,首先找到该域内的function关键字,将该函数进行储存,若出现重名函数,后声明的函数覆盖先声明的函数;然后找到该域内的var关键字,若该变量名已经被保存为函数或另一个变量则什么都不发生,否则储存该变量,并将它的值初始化为undefined
作用域练习题详解
<script>
//1.
var a=1;
function fn1(){
console.log(a); //undefined
var a = 2; //在函数体没用就直接销毁
}
fn1();//1---拿的全局变量
console.log(a);//1---还是全局变量
//2.
var a=1;
function fn1(){
console.log(a); //1---拿到的全局变量
a = 2; //修改全局
}
fn1();//2---拿到的全局变量
console.log(a);//2修改后的全局变量
//3.
var a=1;
function fn1(a){ //var a
var a;//undefined
console.log(a); //通过作用域链去找全局变量
a = 2;
}
fn1();//1:找全局的
console.log(a);//1
//4.
var a=1;
function fn1(){
console.log(a); //1
a = 2;
}
fn1(a);//障眼法 存在arguments对象
console.log(a);//2
</script>
3.到同级或低级作用域找变量
<script>
//修改全局变量 获得作用域
var b;
function fn1(){
var a=10;
b=a;
}
fn1();
alert(b);
// 同级获取作用域变量
var b;
function fn1(){
console.log(b);
}
function fn2(){
var a=10;
b=a;
}
fn2();
fn1();
//传参数方法
function fn1(a){//var a;形参
console.log(a);
}
function fn2(){
var a=10;
fn1(a);//a=10实参
}
fn2();
</script>