js包括两级作用域: 1). 作用域; 2). 作用域;
1、全局作用域
- 不属于任何函数的外部范围称为 ;
- 保存在全局作用域的变量称为 。
1.1 全局变量
- 优点: 可反复使用;
- 缺点: 容易造成全局污染。
<script>
var a = 0; // 全局变量
function fn1(){
var m = 0;
}
</script>
2、 函数作用域
- 一个函数内的范围称为函数作用域
- 保存在函数作用域内的变量称为局部变量
<script>
function fn1(){
<!-- 局部作用域 -->
var b = 0; //局部变量
function fn2(){
var c = 0;
}
}
</script>
特例: - 形参变量虽然没有用var声明,但是形参变量也是函数内的局部变量
<script>
function fn1(x){
console.log(x); //局部变量
}
</script>
2.1 局部变量特点
- 优点: 不会被污染
- 缺点: 无法反复使用
注: { }
- 不是所有{ }都能形成作用域;
- 也不是所有{ }内的数据都能是局部变量。
- 比如:
- 对象的{ },就不是作用域;
- 对象中的属性,也不是局部变量
<script>
var obj = {
name: "冰墩墩",
}
</script>
注:
- 除{ }之外的其余{ },都不是;
- 内部的变量都会超出{ }的范围,从而影响外部程序。
<script>
console.log(a);
if(false){
var a=10;
}
console.log(a);
</script>
代码执行
var a;//声明提前
console.log(a); //不报错, undefined
if(false){
//不是作用域,拦不住变量被声明提前
a=10;
}
console.log(a);
3、终章思考
- 为什么函数内获取对象属性的name,必须加this?
- intr: function(){}的function能不能换成箭头函数'intr: ()=>{}'?
<script>
var lilei={
name: "冰墩墩",
intr: function(){
console.log(“我是奥运吉祥物${this.name}”)
}
}
</script>