JavaScript的闭包形式与预编译

闭包形式

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值