美文网首页程序员
JS--闭包(二)

JS--闭包(二)

作者: FeRookie | 来源:发表于2017-02-09 23:11 被阅读0次

这里我们根据之前介绍的闭包延伸一下其他的知识点。

在闭包中,其保存的是整个变量对象。闭包只能取得包含函数中任何变量的最后一个值。下面举个栗子:

以上整个函数createFn()执行后会返回一个result数组,表面上看result数组中的每个函数执行后会返回自己的索引值,例如0位置的函数返回0,1位置的函数返回1....,,实际上返回的都是10,。这是因为每创建的内部函数会将外部函数即createFn的活动对象添加到其作用域链上,所以它们引用的都是同一个变量i。所以当createFn函数返回后,i的值已经变为10了,所以内部函数所引用外部函数i的值也就是10了。如果要输出的是每个函数在数组中的下标,我们可以创建另一个匿名函数。如下:

关于this对象:this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。然而,匿名函数的执行环境是具有局限性,其this对象通常是指向window的

由于闭包的编写,这一点可能有些不同:

当执行obj对象中getName方法返回出来的函数,猜猜会返回什么字符串。并不是"MY NAME",返回的是"WINDOW"。

这是因为,每个函数调用的时候都会去得到两个特殊的变量,this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象位置。因为不会访问其外部函数这个两个变量。如果把外部函数的this存到闭包能够访问到的变量里面,那么就可以让闭包访问该对象了。

this和arguments有同样的问题,那么就用同样的方法进行处理就好了。

内存泄漏:闭包在IE的这些版本中会导致一些特殊的问题。如果闭包的作用域链中保存一个HTML元素。那么就意味着这个元素无法被销毁。

以上函数创建了一个作为ele元素事件处理程序的闭包。这个闭包又引用了外部函数的一个变量ele,这就导致无法减少对ele的引用,只要匿名函数存在,那么就用于不会收回。

必须记住:闭包会引用包含函数的整个活动对象!!而并不是其中的某个变量或者dom元素。

--------以上根据javascript高级程序设计总结。

相关文章

  • JS--闭包(二)

    这里我们根据之前介绍的闭包延伸一下其他的知识点。 在闭包中,其保存的是整个变量对象。闭包只能取得包含函数中任何变量...

  • js--闭包

    当在函数内部定义了其他函数时,就创建了闭包。 在后台执行环境中,闭包的作用域链包含着它自己的作用域、外部函数的作用...

  • JS--闭包(一)

    闭包:是指有权访问另一个函数作用域中的变量的函数。 创建闭包的常见方式,是在一个函数内部创建另外一个函数: 如上,...

  • 再学JS--闭包

    MDN对闭包的定义: 闭包是指那些能够访问自由变量的函数 那什么是自由变量? 自由变量是指在函数中使用的,但既不是...

  • js--闭包概念详解

    关于闭包,简而言之,每个函数都是一个闭包,闭包就是一个私有的空间。函数里面定义的变量和方法等都在这个私有空间中,外...

  • JS--闭包、定时器

    什么是闭包? 有什么作用? 闭包是指有权限访问另一个函数作用域的变量的函数(就是能够读取其他函数内部变量的函数)。...

  • JS--作用域和闭包

    作用域 1、全局作用域2、函数作用域3、块级作用域(ES6新增)if(true){let x = 100}cons...

  • Web前端------JS高级闭包、沙箱介绍

    闭包介绍 闭包小案例(一) 闭包小案例(二) 闭包小案例(三)--------模拟点赞 效果展示: 沙箱 欢迎关注...

  • 函数表达式

    一、函数声明提升 二、递归 三、闭包(详见闭包)

  • 第三周第二天

    第三周第二天 函数作为参数,匿名函数(闭包)尾随闭包 闭包,尾随闭包 数组的过滤,缩减,映射

网友评论

    本文标题:JS--闭包(二)

    本文链接:https://www.haomeiwen.com/subject/cmbwittx.html