一、作用域
1、定义
代码发挥作用的区域。
2、分类
2.1 全局作用域
- 全局变量
在函数外面定义的变量。
//全局变量在任何地方都能够访问
var n = 20;
console.log(n);
function fn() {
console.log(n);//20
}
fn();
console.log(n);//20
注意:
全局变量会保存在window对象里,全局变量的生命周期是在页面打开时产生,页面关闭就自动消失。
2.2局部作用域
- 局部变量
在函数内部定义的变量。
//局部变量只能在函数内部访问,外部无法使用
function fn(){
var n = 10;
}
fn();
console.log(n);//函数外部访问局部变量,会报错
注意:
局部变量的生命周期是函数调用时产生,调用结束即消失。
3、作用域的产生
JS中如if for是无法形成作用域的,故在大括号里外声明的变量在任何地方都可以访问。
//if for语句里声明的变量在任何地方都能访问
var i=1;
if (i<=10) {
var n = 20;
i++;
}
console.log(n); // 20
for(var i=1 ;i<=10;i++){
}
console.log(i); // 11
二、变量的访问规则
- 局部位置变量的访问规则
在局部位置访问变量时,遵从就近原则:即先从局部作用域下找该变量,如果找到就停止寻找,如果局部作用域下没有,往上找,如果全局作用域下都没有,则报错。
var x = 10;
function fn(){
var x = 20;
console.log(x); //20
}
fn();
var a = 20;
function foo() {
console.log(a);//undefined
var a = 10;
console.log(a);//10
}
foo();
三、变量的赋值规则
- 局部位置变量的赋值规则
局部位置变量的赋值规则依旧遵从就近原则。
var x = 10;;
function fn() {
var x = 20; //初始值
x = 30; //重新赋值
console.log(x); // 30
}
fn();
console.log(x); // 10
var a = 10;
function test(a) {
// a: 局部变量
a = a- 3; // a=7
}
test(a);
console.log(a); //10
四、变量提升
JavaScript 中,变量的声明都将所有声明部分提升到当前作用域的最顶部,并且函数提升在变量提升上面。
对于变量:变量的声明部分会提升,初始化的值不会。
对于函数:函数整体都会被提升。
//原始代码
fn();
function fn(){
console.log(a);
}
var a = 10;
//经过JS解释器的代码
//函数提升在变量之上
function fn(){
console.log(a);
}
var a ;
fn();
a= 10;
五、递归
在函数内部,直接或者间接调用函数自己。
//通过递归循环输出语句
var x =0;
function fn(){
x++;
console.log('明天又明天,明天何其多!');
if (x==10) {
return;
}
fn();//函数内部调用函数本身
}
fn();
注意:
递归一定要有出口,不然就是死递归
return: 终止函数的执行
break: 用于终止循环
六、对象
-
概念
对象是一组无序的相关属性和方法的集合。 属性:静态的描述信息: 如身高,体重... 方法:动态的行为: 如吃饭,睡觉.....
2、定义
var obj = {}
//对象属性
obj.name = '小明';
obj.age = 19;
obj.weight = 150;
obj.sex = '男'
//对象的方法
obj.eat = function(){
console.log('会吃吗');
}
console.log(obj);//obj代表整个对象
3、对象的遍历
for(var k in obj){
// console.log(k); // 键
// console.log(obj[k]); //值
console.log(k, obj[k]);
}