最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Javascript中作用域+闭包的详细讲解

来源:懂视网 责编:小采 时间:2020-11-27 19:32:52
文档

Javascript中作用域+闭包的详细讲解

Javascript中作用域+闭包的详细讲解:作用域:[[scope]]:每一个javascript函数都是一个对象,对象中有些属性我们可以访问,但是有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。运行期上下文:当函数执行
推荐度:
导读Javascript中作用域+闭包的详细讲解:作用域:[[scope]]:每一个javascript函数都是一个对象,对象中有些属性我们可以访问,但是有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。运行期上下文:当函数执行

作用域:

[[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();

1.png

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高级视频教程

文档

Javascript中作用域+闭包的详细讲解

Javascript中作用域+闭包的详细讲解:作用域:[[scope]]:每一个javascript函数都是一个对象,对象中有些属性我们可以访问,但是有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。运行期上下文:当函数执行
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top