视频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
实例浅析对闭包的理解
2020-11-27 19:57:10 责编:小采
文档


本篇文章给大家分享的是浅谈对闭包的理解 ,内容挺不错的,希望可以帮助到有需要的朋友

作用域链

要更清楚的理解闭包应该先充分的理解作用域链,这样理解闭包就会轻松很多。

作用域链就是一个指向不同变量存储空间的列表,通常在全局下都会被window的变量环境所包围。

每一个执行环境的[[scope]]的属性都存放着作用域链的引用。

var name = "tianci";

当我们执行完上面的代码的时候,在浏览器中window.name属性便是“tianci”,此时window[[scope]]指向的作用域列表所指向的变量空间就有name:"tianci"存在

var name = "tianci";
function sy() {
 var name = "haha";
 console.log(name);
}
sy();//haha

在这个代码中,执行到sy()的时候,sy的执行环境的[[scope]]指向的作用域列表会先将window的作用域列表复制到自己的列表,在将sy变量空间插入到作用域列表的头部(即 list.[0]的位置)。当执行到name的时候便会从列表开始查询name变量,0->1 -> 2 ->3 ......一直到最顶层的变量环境为止。

var name = "tianci";
function sy() {
 var name = "haha";
 console.log(name);
 console.log(this.name);
}
sy();

//haha
//tianci

两次输出不一样

log(name)的时候函数sy先从自身的环境中找name所以输出haha

log(this.name)的时候sy的this指向了window(在浏览器中),所以查询的起始会从window的环境开始查找name所以输出tianci

1.作用域链就是一个指向多个对象存储空间的列表,

2.每次函数被调用的时候,就会先将调用者的作用域链copy到自己的作用域链,再在链表头部插入自己的作用域

闭包

闭包就不是很难理解了,闭包概念就是有权访问另一个函数作用域的变量的函数,其常见的创建方式就是在汉输得内部创建另一个函数 如:

function cC(property) {
 return function (obj1,obj2) { var value1 = obj1[property]
 var value2 = obj2[property]
 if (value1 < value2) {
 return -1;
 }else if(value1 > value2){
 return 1;
 }else if(value1 == value2){
 return 0;
 }
 }
}

在这里匿名函数中便访问了调用函数的变量property,这便是闭包

但是闭包会有一个问题,就是当cC执行完之后匿名函数若没有执行结束,cC的环境活动对象也不会被销毁,只有等匿名函数执行完之后,才会被销毁。所以闭包有时候会造成不必要的内存泄漏

通常情况下匿名函数的this对象会指向window(浏览器中)

因为当得到返回的匿名函数之后通常都是在全局环境中直接调用了,所以会造成this当时指向的是window。

var name = "chentainci";
var obj ={
 name:"myboj",
 getName:function () {
 return function () {
 return this.name
 }
 }
}
console.log(obj.getName()())

闭包只是取得变量的终值

function fun() {
 var result =new Array();
 for (var i = 0;i < 10; i++) {
 result[i] = function () {
 return i
 }
 }
 return result;
}

result存储的是个函数的返回值都是i的终值10

相关推荐:

下载本文
显示全文
专题