细品作用域
- 作用域
- 分类
- 全局作用域
- 局部作用域
- 内部作用域链
- 总结
作用域
变量名作用的范围
分类
JavaScript由ECMAScript和DOM、BOM三者组成。
JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。
ES6新增块级作用域
补充:块作用域
块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
1. var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
2. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
3. const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
4. 同一个变量只能使用一种方式声明,不然会报错
全局作用域
作用于js起作用的部分
声明 全局作用域下var声明
特殊情况下,函数内不用var声明的
浏览器关闭才销毁
局部作用域
作用于所在函数内
声明 函数内部var声明的
函数使用时初始化,函数运行结束时销毁
内部作用域链
内部函数可以访问外部变量=》链式查找决定哪些数据能被内部访问,称 作用域链
总结
一个作用域可以使用并影响外层作用域中的变量,不可以使用里层作用域的变量
!!!传参时,如数组、对象这类变量实际指向内容的存储地址的(而非内容的),全局复杂变量在函数中改变变量值会影响在全局的值。而string ,number,boolean,undefined,null不能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>作用域</title>
</head>
<body>
<script type="text/javascript">
console.log("作用域---------------------");
var a=5;
console.log("全局定义"+a);
change();
console.log("局部修改后全局访问"+a);
function change(){
console.log("局部访问"+a);
a=4;
console.log("局部修改为"+a);
}
console.log("总结:一个作用域可以使用并影响外层作用域中的变量,不可以使用里层作用域的变量\n\n\n");
console.log("传参-------------------------");
var b=5;
console.log("全局定义"+b+'实参为b形参为c');
changeP(b);
console.log("通过传参,局部修改后,全局访问"+b);
function changeP(c){
console.log("局部访问"+c);
c=4;
console.log("局部修改为"+c);
console.log("b此时为"+b);
}
console.log("string-----------------------");
var b="string";
console.log("全局定义"+b+'实参为b形参为c');
changePs(b);
console.log("通过传参,局部修改后,全局访问"+b);
function changePs(c){
console.log("局部访问"+c);
c[1]='o';
console.log("局部修改为"+c);
c='os';
console.log("局部修改为"+c);
console.log("b此时为"+b);
}
console.log("null------------------------");
var b=null;
console.log("全局定义"+b+'实参为b形参为c');
changePn(b);
console.log("通过传参,局部修改后,全局访问"+b);
function changePn(c){;
c={m:'os',t:'bb'};
console.log("局部修改为"+c);
console.log("b此时为"+b);
}
console.log("undefined-------------------------");
var b=undefined;
console.log("全局定义"+b+'实参为b形参为c');
changePu(b);
console.log("通过传参,局部修改后,全局访问"+b);
function changePu(c){;
c='os';
console.log("局部修改为"+c);
console.log("b此时为"+b);
}
console.log("boolean-------------------------");
var b=true;
console.log("全局定义"+b+'实参为b形参为c');
changePb(b);
console.log("通过传参,局部修改后,全局访问"+b);
function changePb(c){;
c=false;
console.log("局部修改为"+c);
console.log("b此时为"+b);
}
console.log("数组-------------------------");
var d=new Array();
console.log("全局定义d"+d+'实参为b形参为c');
d[0]="hello";
console.log("全局定义d"+d+'实参为b形参为c');
changePa(d);
console.log("通过传参,局部修改后,全局访问"+d);
function changePa(c){;
c[0]="1";
console.log("局部修改为"+c);
console.log("b此时为"+d);
}
console.log("对象-------------------------");
var d=new Object();
console.log("全局定义d"+d+'实参为b形参为c');
d[0]="hello";
console.log("全局定义d[0]"+d[0]+'实参为b形参为c');
changePa(d);
console.log("通过传参,局部修改后,全局访问"+d[0]);
function changePa(c){
c[0]="1";
console.log("局部修改为"+c[0]);
console.log("b此时为"+d[0]);
}
console.log("总结:!!!传参时,如数组、对象这类变量实际指向内容的存储地址的(而非内容的),全局复杂变量在函数中改变变量值会影响在全局的值。而string ,number,boolean,undefined,null不能。\n\n\n");
</script>
</body>
</html>