视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Javascript中作用域+闭包的详细讲解
2020-11-27 19:32:52 责编:小采
文档

作用域:

[[scope]]:每一个javascript函数都是一个对象,对象中有些属性我们可以访问,但是有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。

[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象,一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行期上下文,当函数执行完毕,它所产生的执行期上下文就会被销毁。

作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式连接,我们把这种链式链接叫做作用域。

function a(){
 function b(){
 function c(){
 }
 } 

}

a defined a.[[scope]] ===> 0: GO

a doing a.[[scope]] ===> 0: aAO

1:GO

b defined b.[[scope]] ===> 0: aAO

1:GO

b defined b.[[scope]] ===> 0: bAO

1:aAO

2:GO

c defined c.[[scope]] ===> 0: bAO

1:aAO

2:GO

c defined c.[[scope]] ===> 0: cAO

1:bAO

2:aAO

3:GO

闭包

当内部函数被保存到外部时,将会产生闭包,闭包会导致原有作用域链不释放,造成内存泄露。

function a(){
 function b(){
 var bbb = 234;
 console.log(aaa);
 }
 var aaa = 123;
 return b;
}
var glob = 100;
var demo = a();
demo();

a函数被销毁前返回了b函数,所以b函数所产生的作用域链并没有被销毁,并且此时b函数并没有被执行,在下面demo()调用的时候console.log(aaa)时,执行b函数,bAO中没有变量aaa,所以返回父级aAO中寻找到aaa = 123,故结果为123.

那么,怎样让b函数在返回之前就能够执行呢?

引入立即执行函数

立即执行函数,针对初始化功能的函数,

1.(function(){}());(w3c建议第一种)

2.(function(){})();

只有表达式才能被执行符号执行

被立即执行符号执行的函数表达式后函数不能被再次使用

可通过加号,减号等将函数转化为函数表达式

+/-/! function test(){

console.log(‘a’);

}

function test(){
 var arr = [];
 for(var i = 0;i < 10;i ++){
 (function (j){
 arr[j] = function(){
 document.write(j+' '); 
 }
 }(i));
 }
 return arr;
	}
	var myarr = test();
	for(var i = 0;i < 10;i ++){
 	 myarr[i]();
 }

输出结果为:1 2 3 4 5 6 7 8 9

相关文章:

详解JavaScript作用域和闭包

JavaScript中的作用域链和闭包

相关视频:

JS高级之作用域-燕十八 Javascript高级视频教程

下载本文
显示全文
专题