JS闭包方案

小夏 科技 更新 2024-01-30

JS 中的闭包概念和闭包的范围是全局的。 我简单谈谈我自己的实战感受。

闭包是可以访问另一个函数作用域中的变量的函数。

创建闭包的一种常见方法是在另一个函数中创建另一个函数。

概念引自:j**ascript 高级编程(第 3 版)。中等7.2 闭合一个部分,178 页

下面是一个示例来说明此概念:

var name = 'window';function outerfun();return innerfun;};outerfun() (结果:1 个窗口 2 个 night3 窗口。
示例**执行时,可以按如下方式分解:

var name = 'window';var fun1 = outerfun();var fun2 = fun1();fun2 是闭包 fun2();乐趣1最终通话
让我们继续处理:

window.name = 'window';window.fun1 = window.outerfun();window.fun2 = window.fun1();fun2 是关闭窗口fun2();最终通话
为什么会变形?因为在最外层,所有变量实际上都是窗口对象!

经过上述细分,我们知道了最终的判断fun2()实际上,fun2 函数等同于窗口环境。

因此,我们知道任何闭包最终都是在窗口环境中执行的,这就是为什么闭包的范围是全局的。

让我们看一下如何单独拆分每个函数

var name = 'window';function fun1()
为什么fun1结果是:窗户而不是夜晚?

知识:我们知道,当任何函数被执行时,它都会先为它创建一个上下文,然后初始化 2 个变量:thisarguments、fun1(调用它的对象,也称为活动对象),即窗口全球范围本地范围最大的区别是局部作用域是在函数内部定义的,在非闭包的情况下,函数在完成时被释放。 所以:

console.log('1',this.name);实际上,它正在看窗户name属性,这个绝对是window因为在函数之前,我们决定var namewindow.name

至于fun1name实际上,在函数中,它根本没有使用,如果我们不明确指定它this.name,即:

var name = 'window';function fun1()
那么结果肯定是:night,如果 fun1 内部没有定义名称,那么全局名称最终将通过原型链(或上下文)找到。

function fun2()
fun2 实际上有 3 个活动:

自函数:fun1 函数、window 函数console.log('2',name);将优先考虑从内部看name变量,未找到!然后从为其提供闭包的父函数开始fun1发现,找到,即:夜晚

console.log('3',this.name);这里明确规定this.name然后,系统将开始寻找原型链this.name由于this指向window,则结果为:窗口

事实上,闭合功能在我们的日常工作中经常使用。

通过文字定义对象 objvar obj = );
3s后显示:hello nightfunction delaydisplay(),3000);}
实际上,这方面的例子还有很多,但无论如何,你必须记住一个概念:函数中的函数。 闭包的优点是可以访问创建闭包对象的变量。

fun2 中的这不应该指向 fun1 吗?这如何直接指向最外层的窗口

这表明你并不完全理解闭包,要理解它指向谁,主要是看看谁执行了当前函数,所以这指向了函数中的谁。 在本例中,fun1 的目的是返回 fun2 函数,但实际执行 fun2 的是窗口。

相似文章

    JS Puzzle Object 中的键是有序的吗?

    当我们使用 for in 遍历对象时,打印结果是否按键的顺序打印?答案是 不一定 最近,当我在做一个项目时,我遇到了一个要求,即下拉列表中有 个固定选项,包括 全部 正常 无效。因此,我定义了一个对象,遍历它,并将结果放入以上 var obj 所以有今天的文章,见下文。对象键的排序规则到底是什么样子...