-如何区分私有变量和全局变量:
1.在全局作用域下声明(预解释的时候)的变量是全局变量
2.在私有作用域中声明的变量和函数的形参都是私有变量
**在私有作用域中,我们代码执行的时候遇到了一个变量,首先确定它是否为私有变量。如果是私有变量,那么和外面的没有任何关系;如果不是私有的,则往当前作用域的上级作用域进行查找,若上级也没有,则继续查找,一直找到window为止。若window下也没有,则:
1.获取值:eg,console.log(x) ---->报错了
2.设置值:eg,x=100;----->相当于给window增加了一个属性名x,属性值为100
**
如何查找当前作用域的上一级作用域:
看当前函数是在哪个作用域下定义的,那么它的上级作用域就是谁,和函数在哪执行的没有任何关系。eg:
var num=10;
function fn() {
var num=100;
return function() {
console.log(num);
};
}
var f=fn(); //f相当于return后面的返回函数
f(); //---->100
(function() {
var num=1000;
f(); //--->100
}) ();
-当函数执行时的步骤:
(直接目的是让函数体中代码执行,首先会形成一个新的私有作用域,然后执行以下步骤)
1.如果有形参,先给形参赋值
2.进行私有作用域中的预解释
3.私有作用域中的代码从上到下执行
“闭包”机制:函数形成一个新的私有作用域保护了里面的私有变量不受外界干扰(外面修改不了私有的,私有的也修改不了外面的)