闭包形式与预编译
闭包形式
1、函数的返回值是函数
function foo(fn){
var n = 0;
return function (){};
}
2、返回的变量是函数
function foo(){
var n= function(){
}
return n;
}
3、全局变量定义的闭包
var outter;
function foo(){
var a = 10;
outter = function(){
console.log(a)
}
}
foo();//执行了以后才赋值
outter()//赋值以后就是函数了,函数再执行
4、函数参数的方式
var inner = function(fn){
console.log(fn)
}
function foo(){
var b = "local"
var n = function(){
return b;
}
inner(n);
}
foo();//调用才会有local出现
预编译
JavaScript是解释性语言,解释性就是逐行解析逐行执行。在Javascript真正被执行之前,
js模板引擎首先把整个文件进行预处理,预处理的过程就是预编译。预处理就是为了消除写代码时的歧义。
1、全局对象GO
全局对象GO(全局作用域)的产生:js引擎会把所有的script>标签中整合到一起,生成一个window对象
2、全局函数
全局函数:在script>标签中声明的函数为全局函数,全局函数会作为window对象的属性,属性是一个方法。
存在,则全局变量作为window 对象的属性。
3、活动对象AO
活动对象AO(局部作用域)Activation Object:在函数被调用的时候产生,用来保存当前函数内部的执行环境,
也叫执行上下文。调用结束之后,AO消除
4、局部变量
局部变量,在函数内部声明的变量称为局部变量。局部变量作为AO对象的属性存在
5、全局预编译
全局预编译:
1、生产window对象
2、查找变量声明,把a作为window对象的属性
3、查找函数声明,把函数名作为window对象的属性名。属性值是一个function
(如果存在同名的变量和函数时,函数的优先级会更高,函数不会被同名的var 声明覆盖,但是之后可以被赋值),例:
console.log(a)//function a() {
// console.log(a)
//}
//var function 不会被var a覆盖,但是被a = 123 赋值
var a = 123
console.log(a)//
function a() {
console.log(a)
}
a()
4、全局预编译结束,结束后,代码从上到下依次执行
6、函数预编译
函数预编译:
1、函数被调用的时候,产生AO对象
2、查找形参,将形参作为AO对象的属性名,形参相当于声明,还没有值,所以这是,值为undefined
3、查找变量的声明,作为AO对象的属性名,值为undefined
4、使用实参的值改变形参的值
5、查找函数声明 ,作为AO对象的属性名,值为function。