首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能在横梁作用域中生成一个预定义的闭包

在横梁作用域中生成一个预定义的闭包是不可能的。横梁作用域(也称为全局作用域)是指在整个程序中都可访问的作用域,而闭包是指一个函数可以访问其词法作用域之外的变量。

闭包的创建需要满足两个条件:函数嵌套和内部函数引用外部函数的变量。在横梁作用域中,无法实现函数嵌套,因此无法创建闭包。

横梁作用域中的变量是全局变量,可以被任何函数访问和修改。而闭包中的变量是私有变量,只能被内部函数访问和修改。这种区别导致了横梁作用域和闭包在变量访问和作用域链方面的差异。

如果你想在横梁作用域中模拟闭包的效果,可以使用立即执行函数表达式(IIFE)。IIFE 是一种立即调用的匿名函数,可以创建一个局部作用域,并且可以在其中定义私有变量和函数。以下是一个示例:

代码语言:txt
复制
(function() {
  var privateVariable = "私有变量";

  function privateFunction() {
    console.log("私有函数");
  }

  // 在这里可以使用 privateVariable 和 privateFunction

})();

在这个示例中,私有变量和私有函数都在立即执行函数的作用域内,无法从外部访问。这种方式可以模拟闭包的效果,但并不是真正的闭包。

总结起来,无法在横梁作用域中生成一个预定义的闭包,因为闭包的创建需要函数嵌套和内部函数引用外部函数的变量,而横梁作用域无法满足这两个条件。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

还担心面试官问

,这种特性在计算机科学中成为 《JavaScript权威指南》中概念 是指有权访问另一个函数作用域中变量函数。...个人理解 就是一个函数,一个可以访问并操作其他函数内部变量函数。也可以说是一个定义在函数内部函数。...函数在定义词法作用域以外地方被调用,使得函数可以继续访问定义词法作用域。...如果我们试图假设循环中一个迭代在运行时都会给自己捕获一个i副本,但是根据作用工作原理,尽管循环中五个函数是在各个迭代中分别定义,但是他们都被封闭在共享作用域中,因此还是只有一个i。...必须有外部封闭函数,该函数必须至少被调用一次 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成,并且可以访问或修改私有的状态。 当然,上面的代码我们还可以写成IIFE形式。

39520

死磕JS:到底是个什么鬼?

有多重要?如果你是初入前端朋友,可以肯定得告诉你,前端面试,必问。面试官们常常用对了解程度来判定面试者基础水平,保守估计,10个前端面试者,至少5个都死在包上。...从一个函数中返回函数不仅仅是一个简单函数定义,它是这个定义加上它可以访问并需要执行变量,这些变量存储在它附带词法作用域中。 我们刚刚描述就是。...每当我们调用 double 时,它都会更新存储在其词法作用域中一个变量(来自其父函数num),从技术上讲,这是函数所具有的隐藏 [[scope]] 属性。...02 缓存和记忆化 假设您想创建一个简单ID生成器。为了确保总是返回比上一个数字,也可以使用。我们将缓存当前变量中最高 ID 值。...当然要熟练掌握,还需要你在不断练习与总结中自我体会! 在《面向对象分析与设计》这本书里有一句话对概括很喜欢,他是这样说: “是懒人对象,对象是天然!”

32620

JavaScript进阶教程(5)-一文让你搞懂作用域链和

("Albert唱歌太好听了"); } f1(); //解析后,代码是逐行执行,执行到 f1()后,去调用函数 f1() 4 在专业书籍上对于解释为:Javascript是指一个函数与周围状态...是一种保护私有变量机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰,即形成一个销毁栈环境。...这句话比较难以理解,对于理解是,在函数A中,有一个函数B,在函数B中可以访问函数A中定义变量或者是数据x,被访问变量x可以和B函数一同存在。...我们把匿名函数储存在一个变量myCounter 中,并用它来创建多个计数器,每次创建都会同时创建,因为每个都有它自己词法环境,每个都是引用自己词法作用域内变量 privateCounter...这些是由他们函数定义和在 setupHelp 作用域中捕获环境所组成。这三个包在循环中被创建,但他们共享了同一个词法作用域,在这个作用域中存在一个变量item。

30152

JavaScript 静态作用域链与“动态”

是不是父作用销毁就行了? 不行,父作用域中有很多东西与子函数无关,为啥因为子函数没结束就一直常驻内存。这样肯定有性能问题,所以还是要销毁。...suzhe 是因为不是外部,只有外部变量时候才会生成,比如我们改动下代码,打印下这 3 个变量。 ? 再次查看 [[Scopes]] (打包带走环境): ? 这时候就有俩包了,为什么呢?...给包下个定义 用我们刚刚试验来给包下个定义是在函数创建时候,让函数打包带走根据函数内外部引用来过滤作用域链剩下链。它是在函数创建时候生成作用域链子集,是打包外部环境。...我们还用特性分析了下为什么有时候调试时候查看不了变量信息,之后分析了下 eval 为什么没法精确生成,什么时候全部打包作用域、什么时候生成, eval 为什么会导致内存占用过多。...静态分析动态这件事情被无数个框架证明做不了,所以返回函数有eval 只能全部打包或者生成。类似webpack 动态import没法分析一样。

62530

还担心面试官问

,这种特性在计算机科学中成为 《JavaScript权威指南》中概念 是指有权访问另一个函数作用域中变量函数。...个人理解 就是一个函数,一个可以访问并操作其他函数内部变量函数。也可以说是一个定义在函数内部函数。...函数在定义词法作用域以外地方被调用,使得函数可以继续访问定义词法作用域。...如果我们试图假设循环中一个迭代在运行时都会给自己捕获一个i副本,但是根据作用工作原理,尽管循环中五个函数是在各个迭代中分别定义,但是他们都被封闭在共享作用域中,因此还是只有一个i。...必须有外部封闭函数,该函数必须至少被调用一次 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成,并且可以访问或修改私有的状态。 当然,上面的代码我们还可以写成IIFE形式。

43710

JS入门难点解析9-深入解析

定义一 我们先来看一下《JavaScript高级程序设计》一书中对定义是指有权访问另一个函数作用域中变量函数。创建常见方式,就是在一个函数内部创建另一个函数。...2.2 定义二 看一下MDN对定义一个函数和声明该函数词法环境组合。从理论角度来说,所有函数都是。 该说法认为“所有函数都是”,是一个很宽泛概念。...2.3 理解定义 其实,网上还有许多关于定义。说法各不相同,有从函数定义角度出发,有从使用角度出发,众说纷纭,让人无所适从。可是在此只列举了以上两种定义为什么呢?...(当然,A作为全局作用域,只要程序未销毁,其中定义变量始终是可以被访问,所以不做讨论。) 所以,非要让包下一个定义是倾向于定义。这其实是分了两个情况: 被嵌套函数只在当前作用域。...深入解析 3.1 被嵌套函数只在当前作用域 对于这种情况,其实在前面文章中我们已经做了很详尽解释。之所以被嵌套函数有权访问其外层嵌套函数作用域中变量,是因为作用域链原因。

50820

经典面试题解析

,所以a[0]就成了一个。...*/ 讲道理,上面这是一个块级作用域,就像函数作用域一样,执行完毕,其中变量会被销毁, 但是因为这个块级作用域中存在一个,且该维持着对自由变量i引用,所以在 被调用之前也就是后续为了测试而...} { let i=10; /*不符合条件,不再向下执行,导致此次块级作用域中不存在,导致let i=10 未像前面的i一样等待被引用,故此次i没有必要继续存在,...3.考点:异步、作用域、 如果无法深入到内部,从原理层面上理解代码运行机制,那么知识只是浮在表面、浅尝辄止。...所以,后面执行回调函数时候,每个函数都能在词法作用域中找到自己对应 i 值。

59940

深入浅出理解

由于原型部分在另外一篇博客有介绍,所以这里只集合了他关于几篇讲解,包括了作用域、执行上下文等。...讲到这里,不得不很遗憾跟大家说:其实以上我们所演示是一种比较理想情况。有一种情况,而且是很常用一种情况,无法做到这样干净利落说销毁就销毁。这种情况就是伟大——。...取b值就直接可以在fn作用域中取,因为b就是在这里定义。而取x值时,就需要到另一个作用域中取。到哪个作用域中取呢? 有人说过要到父作用域中取,其实有时候这种解释会产生歧义。...至于“”这个词概念文字描述,确实不好解释,看过很多遍,但是现在还是记不住。 但是你只需要知道应用两种情况即可——函数作为返回值,函数作为参数传递。...否则,到时候出了BUG你都不知道为什么,因为这些BUG可能完全在你知识范围之外。 到现在就简单介绍完了。

69320

从来不理解JavaScript,直到有人这样向我解释它

这是参与「掘金日新计划 · 10 月更文挑战」第29天,点击查看活动详情 为什么需要 首先我们来看一下为什么需要。...返回内部函数和它外部变量 food 实际上就是一个实质,就是引用了自由变量函数。这个被引用自由变量将和这个函数一同存在,即使离开了创造它环境也例外。...自由变量可以理解成跨作用变量,比如子作用域访问父作用变量。 如下代码中,console.log(a)  要得到 a 变量,但是在当前作用域中没有定义 a(可对比一下 b)。...综上所述,其实就是利用到了作用域链知识。 把这个理解了,原理也就明白了。 那么为什么说每一个函数都是一个呢?...应用场景有哪些?怎么销毁是指有权访问另外一个函数作用域中变量函数。

30850

《JavaScript函数式编程》读后总结一

没错,还记得应用场景么?函数作为返回值 和 函数作为参数传递。再进一步回忆下,函数中自由变量取值自哪里?自由变量值从函数创建时所处作用域中取得,划重点是创建时,而非调用时。...就是一个普通函数,在该函数生成时会“捕获”附近值。这个“附近”指的是该函数创建时所处作用域,这个值就是函数中自由变量值。...组织一下语言表述:就是一个函数,与普通函数区别在于,它能捕获自身创建时所处作用哉中值作为自己作用哉内自由变量值,这个捕获值可以是任何类型,包括函数,并且该函数在其他作用域中被调用时,仍然能保持对该自由变量值引用...,觉得非常形象,在此分享下:函数尤如一个吸血鬼,捕获一个部下后给其永久生命以供驱策,直到这个吸血鬼被摧毁,它部下才会随之解放并毁灭。...类比捕获一个其创建时所处作用域中变量以供其使用,即使该变量所处作用域在程序执行下去时已经销毁,但该变量值由于仍始终被引用,所以系统回收机制会始终视而不见让它一直活着,直到这个包被主动销毁

36910

进阶 | 详细图解作用域链与

初学JavaScript时候,在学习包上,走了很多弯路。而这次重新回过头来对基础知识进行梳理,要讲清楚,也是一个非常大挑战。 有多重要?...面试官们常常用对了解程度来判定面试者基础水平,保守估计,10个前端面试者,至少5个都死在包上。 可是为什么如此重要,还是有那么多人没有搞清楚呢?是因为大家不愿意学习吗?...1、基础数据类型与引用数据类型 2、内存空间 3、垃圾回收机制 4、执行上下文 5、变量对象与活动对象 作用域 1、在JavaScript中,我们可以将作用定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套作用域中根据标识符名称进行变量查找...1、作用域链息息相关; 2、是在函数执行过程中被确认。 先直截了当抛出定义:当函数可以记住并访问所在作用域(全局作用域除外)时,就产生了,即使函数是在当前作用域之外执行。...简单来说,假设函数A在函数B内部进行定义了,并且当函数A在执行时,访问了函数B内部变量对象,那么B就是一个。 在基础进阶(一)中,总结了JavaScript垃圾回收机制。

55821

2023学习日志

宏将错误信息输出到标准错误中,避免标准输出与标准错误内容相混淆。定义是函数式编程中基础概念,简要概括为,是和上下文有关函数,能够捕获其所在作用域中变量。...在rust中,一个可以保存在变量中或作为参数传递匿名函数。与类型注解不同与普通函数,编译器可以通过编译器推断参数及返回值类型,因此可以标明参数及返回值类型(也可自己加上类型声明)。...,仅对其进行读取操作捕获可变借用即对捕获到变量进行修改,但不改变所有权值得注意是,可变借用与其他借用不能同时存在,因此定义与调用之间作用域中不能有其他不可变借用,如,不能在定义与调用之间作用域出现捕获到变量输出语句...能够捕获其环境中变量引用或所有权(影响什么移进,如有),体(函数体)中代码定义了对引用或值进行操作(影响什么移出,如有)。...、渐进地实现一个或多个Fn trait,无需显式声明,也可自行定义实现Fn traitFn trait有三种:FnOnce 适用于能调用一次,所有都至少实现了FnOnce Trait,因为所有都能至少调用一次

10900

JS完美收官之——

在上一篇JS完美收官之作用域中,我们已经知道当函数执行完毕后,它所产生执行期上下文会被销毁,被世人称之为渣男类型,用完就丢掉,而今天我们探究却与之相反,可以将理解为"痴情男孩...",就是不管怎么打,怎么骂,都紧紧拽着你衣角那种,不由想起曾小贤那句“好男人就是就是”。...,此时作用域链上绑着三条引用,如图: 以上过程其实就是,但凡内部函数被保存到了外部,它一定生成。...弊端:当内部函数被保存到外部时候一定生成会导致原有的作用域链释放造成内存泄漏。...10个函数分别与test函数形成并且共享test函数生成执行期上下文,也就是共享变量 i ,当test()返回时,变量 i 值为10,所以都共享这个值,因此数组中函数返回值都是同一个值。

20010

JavaScript作用(你不知道JavaScript)

JavaScript并不具有动态作用域,它只有词法作用域。词法作用域是在写代码或者说定义时确定,而动态作用域是在运行时确定。...timer具有涵盖wait()作用,保有对变量message引用。 wait()执行1000毫秒后,它作用域并不会消失,timer依然保有wait()作用。...根据作用工作原理,尽管五个函数是在各个迭代中分别定义,但是它们都被封闭在一个共享全局作用域中,因此实际上只有一个i。...1~5 每个迭代都生成一个作用域,使得延迟函数回调可以将新作用封闭在每个迭代内部,每个迭代中都会含有一个具有正确值变量供我们访问。...(2)封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成,并且可以访问或者修改私有的状态。

41831

推翻JavaScript中三座大山:作用域篇

这里有两个典型做法,第一种就是全局空间命名,用一个复杂名字来定义某个对象,然后将要暴露出来变量作为该对象属性,规避变量名冲突;第二种就是模块管理,强制所有标识符都不能注入共享作用域中去。...3、函数声明提升,不受逻辑判断控制; 作用 谈完了作用域,那我们就不得不提基于作用一个特别重要概念:。函数可以记住并访问所在词法作用域时,就产生了。...} var func = foo(); func(); //2 ---这里就是效果 引用了foo中词法作用域中变量 当某个函数可以记住并访问所在词法作用域,那么就可以在其他地方使用这个...一个很常见关于误解经常发生在循环中。...这里我们使用了+块代码,其中块代码作用域是全局,所以当执行完循环之后运行setTimeout中之后,其中引用i就是全局公共区域中i,也就是6。所以最终输出6个6.

52020

作用域和

换句话说,可以把变量和函数包裹在一个函数作用域中,然后用这个作用域来“隐藏”它们。 为什么“隐藏”变量和函数是一个有用技术? 有很多原因促成了这种基于作用隐藏方法。...# 实质 当函数可以记住并访问所在词法作用域时,就产生了,即使函数是在当前词法作用域之外执行。...bar() 依然持有对该作用引用,而这个引用就叫作。 bar() 函数在定义词法作用域以外地方被调用。使得函数可以继续访问定义词法作用域。...无论通过何种手段将内部函数传递 到所在词法作用域以外,它都会持有对原始定义作用引用,无论在何处执行这个函数都会使用。...模块模式需要具备两个必要条件: 必须有外部封闭函数,该函数必须至少被调用一次(每次调用都会创建一个模块实例) 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成,并且可以访问或者修改私有的状态

68520

前端工程师在面试时经常被问到底是什么?用打包礼物例子让你秒懂

,但是鲜有求职者能够流利、准确答出,本文笔者将带大家好好了解一下,由于知识点比较多,尽可能用浅显易懂的话和图片来讲解。...JavaScript 中作用定义了可以访问变量,一般有两种作用域: 全局作用域 局部作用域 1.1 全局作用域 如果一个变量在所有函数或花括号 ( {}) 之外声明,则称它是在全局范围内定义。...1.2.2 块作用域 块作用域是用大括号{}表示作用域,在块作用域中声明变量,那么只能在该块作用域中进行访问。 { const wljs = 'wljslmz good at wljs!'...再给你分享一个万能包公式,等到你忘了是怎么回事时候,可以快速回忆到: function hello() { return function (item) { console.log...,有时候只是好多人用了也不知道这个概念,并且在面试中也是高频面试技术点,大多数人都反映很难,但是觉得只要你认真看了这篇文章,你会发现也就那样。

46150

深入理解Python变量作用域与函数

当然,我们也会涉及一些题外话,即Python知识。...与L区别在于,对一个函数而言,L是定义在此函数内部局部作用域,而E是定义在此函数上一层父级函数局部作用域。主要是为了实现Python,而增加实现。...这里需要注意是global关键字,使用了这个关键字之后,在nested函数中使用spam变量就是全局作用域中spam变量,而不会新生成一个局部作用域中spam变量。...这里需要特别注意:inner也只是一个变量名,是遵循python变量查找规则(Python先在outer函数作用域中寻找名为innerlocal变量) 4、 原理我们直接通过下面的例子来解释...Python支持一种特性叫做函数(function closures):在非全局(global)作用域中定义inner函数(即嵌套函数)时,会记录下它嵌套函数namespaces(嵌套函数作用

1.6K60

JS作用域与

局部变量在函数内定义,只能在函数内部访问,在函数开始执行时创建,在函数执行完之后会自动销毁。 JS作用域分为全局作用域和函数作用域。...变量在函数外定义就是全局变量,在全局作用域中一个全局对象window,可以直接使用。 全局作用域中变量都是全局变量,在页面的任意部分都可以访问到。...也就是说,它不能访问innerTest()环境。 5|0 一个可以访问外部(封闭)函数作用域链中变量内部函数。...作用域链配置机制引出了一个问题,就是只能取得包含函数中任何变量最后一个值。 所保存是整个变量对象,而不是某个特殊变量。...优点: 产生全局变量,可以避免全局变量污染,实现属性私有化缺点: 会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏,在不用时候需要删除有3个特性: 函数嵌套函数 在函数内部可以引用外部参数和变量

1.9K20
领券