如何区分私有变量还是全局变量:
- 在全局作用域下,预解释的时候,声明的变量是全局变量。
- 在"私有作用域中声明的变量"和"函数的形参",都是私有的变量。
在私有作用域中,我们代码执行的时候,遇到了一个变量,首先需要确定它是否为私有变量,如果是私有变量,那么和外边的没有任何关系;如果不是私有的,则往当前的作用域的上一层作用域进行查找,如果上级中也没有,则继续查找,一直查找到window为止。这就是作用域链。
var num = 10; // num 是全局变量
function(num1) {
console.log(num1); // num1 是私有变量
var num2 = 12; // num2 是私有变量
}
当函数执行的时候,其直接目的是让函数体中的代码执行,首先会形成一个新的私有的作用域,然后按照如下的步骤执行。
- 如果有形参,先给形参赋值。
- 进行私有作用域的预解释。
- 私有作用域中的代码从上到下执行。
函数形成一个私有的作用域,保护了里面的私有变量不受外界的干扰,外面修改不了私有的变量,同样的,私有的也修改不了外界的变量。这种机制称之为"闭包"。
现在分析如下代码:
console.log(total); // undefined
var total = 0;
function fn(num1, num2) {
console.log(total); // undefined
var total = num1 + num2;
console.log(total); // 300
}
fn(100, 200);
console.log(total); // 0