摘要
@H_404_3@闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包@H_404_3@
一、什么是闭包?
@H_404_3@闭包就是可以访问另一个函数作用域中变量的函数。@H_404_3@
下面列举出常见的闭包实现方式,以例子讲解闭包概念@H_404_3@
f1是f2的父函数,而f2被赋给了一个全局变量(return的值),这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收,这便形成了闭包。@H_404_3@
因此,可以这么理解。闭包机制就是,如果A函数引用了另一个函数B的变量,但是B返回后A仍没有返回,仍存在,因为A的引用,所以B的所有局部变量并不会随B退出而注销,会一直存在,直到A注销。此时A就是闭包。@H_404_3@
闭包通常在全局环境调用的,所以this通常指向window,具体情况还是需要视执行环境而言,总之this指向执行环境。@H_404_3@
若需要闭包的this指向闭包的包含对象,则需要将包含对象的this作为变量传进闭包。@H_404_3@
1、在外面再加一层函数,将i作为函数参数传进来,这样每次保存的是函数内部的变量,与外部i不是同一个内存空间,而每次调用函数都会生成一个局部变量,所以可以保证每次保存的值互不影响。@H_404_3@
2、用ES6新特let,将for循环的var i改成let i,这样当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。@H_404_3@
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程之家!@H_404_3@二、闭包的this指针
@H_404_3@
三、使用闭包的注意点
@H_404_3@
四、解决一道闭包常见面试题
@H_404_3@
问题:
@H_404_3@
解决方法
@H_404_3@