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 个变量:this
跟arguments
、fun1(调用它的对象,也称为活动对象),即窗口全球范围
跟本地范围
最大的区别是局部作用域是在函数内部定义的,在非闭包的情况下,函数在完成时被释放。 所以:
console.log('1',this.name);
实际上,它正在看窗户name
属性,这个绝对是window
因为在函数之前,我们决定var name
window.name
至于fun1
name
实际上,在函数中,它根本没有使用,如果我们不明确指定它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 的是窗口。