1.如何区分私有变量和全局变量?
1)在全局作用域下声明(预解释的时候上)的变量是全局变量
2)在“私有作用域中声明的变量”和“函数的形参”都是私有变量
在私有作用域中,我们代码执行的时候遇到了一个变量,首先我们需要确定它是否为私有的变量,如果是私有的变量,那么和外面的没有任何的关系;如果不是私有的,则往当前作用域的上级作用域进行查找,如果上级作用域也没有则继续查找,一直找到window为止 ...(作用域链)
2.当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有的作用域,然后按照如下的步骤执行:
1)如果没有形参,先给形参赋值
2)进行私有作用域中的预解释
3)私有作用域中的代码自上而下执行
...
4)函数形成一个新的私有的作用域保护了里面的私有变量不受外界干扰(外面修改不了里面的),私有的也修改不了外面的-》闭包
闭包:闭包是一种机制,函数执行的时候形成了一个私有的作用域,保护里面的私有变量不受外界干扰。
//预解释的时候不管你的条件是否成立,都要把带var的进行提前的声明
//window的预解释:var num; -> window.num
if(!('num' in window)){
var num = 12;
}
console.log(num) // undefined
3.执行函数定义的那个function在全局作用域下不进行预解释,当代码执行到这个位置的时候定义和执行一起完成了
// 自执行函数:定义和执行一起完成了,不进行预解释
(function(num){})(100)
~function(num){}(100
+function(num){}(100)
-function(num){}(100)
!function(num){}(100)
4.函数体中的return下面的代码虽然不在执行了,但是需要进行预解释;return后面跟着的都是我们的返回值,所以不进行预解释。
function fn(){
console.log(num); // undefined
return function(){
};
var num = 10;
}
fn();
5.在预解释的时候,如果名字已经声明过了,不需要重新声明,但是需要重新赋值;在JS中如果变量的名字和函数的名字重复了,也算冲突
预解释:var fn; window.fn; fn = xxxfff000 window.fn = xxxfff000
var fn = 10;
function fn(){
console.log('ok');
}