/usr/bin/env bash export VAR="HELLO, VAR" 当我执行脚本并尝试访问 $VAR 时,我没有得到任何值!...在调用 shell 的上下文中执行脚本: $ cat set-vars1.sh export FOO=BAR $ . set-vars1.sh $ echo $FOO BAR 另一种方法是在脚本中打印设置环境变量的命令...,而不是设置环境变量: $ cat set-vars2.sh #!...-f 指 shell 函数 -n 从每个(变量)名称中删除 export 属性 -p 显示所有导出变量和函数的列表 ---- 参考: stackoverflow question 16618071...help eval 相关阅读: 用和不用export定义变量的区别 在shell编程中$(cmd) 和 `cmd` 之间有什么区别 ----
♣ 问题 在Oracle中,在没有配置ORACLE_HOME环境变量的情况下,如何快速获取数据库软件的ORACLE_HOME目录?...♣ 答案 若配置了ORACLE_HOME环境变量,则可以通过“echo $ORACLE_HOME”来直接获取,如下所示: [oracle@edsir4p1-PROD2 ~]$ echo $ORACLE_HOME...product/11.2.0/dbhome_1 [oracle@edsir4p1-PROD2 ~]$ sqlplus -v SQL*Plus: Release 11.2.0.1.0 Production 若没有配置...ORACLE_HOME环境变量,则可以通过“more /etc/oratab”来直接获取,如下所示: [oracle@edsir4p1-PROD2 ~]$ more /etc/oratab PROD1...,则可以通过pmap命令来查看ORACLE_HOME的路径,pmap提供了进程的内存映射,用于显示一个或多个进程的内存状态。
译者注:外部环境已经跟 ES3 规定的作用域的作用类似 词法环境有两种类型: 全局环境(在全局执行上下文中)是没有外部环境引用的词法环境。全局环境的外部环境引用是 null。...在函数环境中,函数内部用户定义的变量存储在环境记录器中。并且引用的外部环境可能是全局环境,或者任何包含此内部函数的外部函数。 环境记录器也有两种类型(如上!)...: 声明式环境记录器存储变量、函数和参数。 对象环境记录器用来定义出现在全局上下文中的变量和函数的关系。 简而言之, 在全局环境中,环境记录器是对象环境记录器。...在 ES6 中,词法环境组件和变量环境的一个不同就是前者被用来存储函数声明和变量(let 和 const)绑定,而后者只用来存储 var 变量绑定。...这是因为在创建阶段时,引擎检查代码找出变量和函数声明,虽然函数声明完全存储在环境中,但是变量最初设置为 undefined(var 情况下),或者未初始化(let 和 const 情况下)。
代码都是在执行上下文中运行的。 你可以将代码运行与执行上下文的关系类比为进程与内存的关系,在代码运行过程中的变量环境信息都放在执行上下文中,当代码运行结束,执行上下文也会销毁。...绑定ThisBinding:确定当前环境中this的指向,this binding存储在EnvironmentRecord中; 词法环境的类型 全局环境(GlobalEnvironment):在JavaScript...代码运行伊始,宿主(浏览器、NodeJs等)会事先初始化全局环境,在全局环境的EnvironmentRecord中会绑定内置的全局对象(Infinity等)或全局函数(eval、parseInt等),其他声明的全局变量或函数也会存储在全局词法环境中...+ OER VariableEnvironment 变量环境 在ES6前,声明变量都是通过var关键词声明的,在ES6中则提倡使用let和const来声明变量,为了兼容var的写法,于是使用变量环境来存储...这就是为什么你可以在声明之前访问var定义的变量(变量提升),而访问let/const定义的变量就会报引用错误的原因。 let/const 与 var 简单聊聊同是变量声明,两者有何区别?
代码都是在执行上下文中运行的。你可以将代码运行与执行上下文的关系类比为进程与内存的关系,在代码运行过程中的变量环境信息都放在执行上下文中,当代码运行结束,执行上下文也会销毁。...词法环境(LexicalEnvironment)词法环境是ECMA中的一个规范类型 —— 基于代码词法嵌套结构用来记录标识符和具体变量或函数的关联。简单来说,词法环境就是建立了标识符——变量的映射表。...ThisBinding:确定当前环境中this的指向,this binding存储在EnvironmentRecord中;词法环境的类型全局环境(GlobalEnvironment):在JavaScript...代码运行伊始,宿主(浏览器、NodeJs等)会事先初始化全局环境,在全局环境的EnvironmentRecord中会绑定内置的全局对象(Infinity等)或全局函数(eval、parseInt等),其他声明的全局变量或函数也会存储在全局词法环境中...这就是为什么你可以在声明之前访问var定义的变量(变量提升),而访问let/const定义的变量就会报引用错误的原因。let/const 与 var简单聊聊同是变量声明,两者有何区别?
object 简称 VO) 每个执行环境文都有一个表示变量的对象——「变量对象」,全局执行环境的变量对象始终存在,而函数这样局部环境的变量,只会在函数执行的过程中存在,在函数被调用时且在具体的函数代码运行之前...当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。...2、「函数环境」:用户在函数中定义的变量被存储在「环境记录」中,包含了arguments 对象。对外部环境的引用可以是全局环境,也可以是包含内部函数的外部函数环境。...」的原因:在创建阶段,函数声明存储在环境中,而变量会被设置为 undefined(在 var 的情况下)或保持未初始化(在 let 和 const 的情况下)。...环境记录也不一样,全局叫对象环境记录,函数叫声明性环境记录。 你应该明白为什么会存在变量提升,函数提升,而let const没有。
意外的全局变量 全局变量的生命周期最长,直到页面关闭前,它都存活着,所以全局变量上的内存一直都不会被回收 当全局变量使用不当,没有及时回收(手动赋值 null),或者拼写错误等将某个变量挂载到全局变量时...,原因在哪,不急 先说说这代码用途,声明了一个全局变量 t 和 replaceThing 函数,函数目的在于会为全局变量赋值一个新对象,然后内部有个变量存储全局变量 t 被替换前的值,最后定时器周期性执行...是吧,即使周期性调用 replaceThing 函数,函数内的局部变量 o 即使存储着上个全局变量 t 的值,但毕竟是局部变量,函数执行完毕,如果没有外部持有它的引用,也就可以被回收掉了,所以最终内存就只剩下全局变量...,与最开始的区别就在于,至少在 unused 函数执行后,就可以释放掉而已 其实,这里应该考虑的代码有没有问题,为什么需要局部变量存储,为什么需要 unused 函数的存在,这个函数的目的又是什么,如果只是为了在将来某个时刻用来判断上个全局变量...t 是否可用,那么为什么不直接再使用个全局变量来存储,为什么选择了局部变量?
环境记录器是存储变量和函数声明的实际位置。 外部环境的引用意味着它可以访问其父级词法环境(作用域)。 词法环境有两种类型: 全局环境(在全局执行上下文中)是没有外部环境引用的词法环境。...在函数环境中,函数内部用户定义的变量存储在环境记录器中。并且引用的外部环境可能是全局环境,或者任何包含此内部函数的外部函数。 环境记录器也有两种类型(如上!)...: 声明式环境记录器存储变量、函数和参数。 对象环境记录器用来定义出现在全局上下文中的变量和函数的关系。 简而言之, 在全局环境中,环境记录器是对象环境记录器。...在 ES6 中,词法环境组件和变量环境的一个不同就是前者被用来存储函数声明和变量( let 和 const)绑定,而后者只用来存储 var 变量绑定。...这是因为在创建阶段时,引擎检查代码找出变量和函数声明,虽然函数声明完全存储在环境中,但是变量最初设置为 undefined( var 情况下),或者未初始化( let 和 const 情况下)。
eval并不推荐使用,基本上可以算作是一个作废的东西,在这里简单说一下为什么不用他,首先就是他破坏代码结构不利于阅读,而且很多人会用错他,既然经常用错了,那还不如不用;然后就是麻烦,在其中运行的代码没办法调试...: 全局环境(在全局执行上下文中)是一个没有外部环境的词法环境。...函数环境,用户在函数中定义的变量被存储在环境记录中。对外部环境的引用可以是全局环境,也可以是包含内部函数的外部函数环境。...这是因为在创建阶段,代码会被扫描并解析变量和函数声明,其中函数声明存储在环境中,而变量会被设置为 undefined(在 var 的情况下)或保持未初始化(在 let 和 const 的情况下)。...执行阶段 这是整篇文章中最简单的部分。在此阶段,完成对所有变量的分配,最后执行代码。
,上面的代码的标准解释就是变量被命名了,但是还未初始化,此时在变量存储的内存里只拥有栈区的变量标示符而没有栈区的变量值,当然更没有堆区存储的对象。...在代码一里我注释了全局变量的定义,结果和引子里代码的结果一致,这说明函数内部a变量的使用和全局环境是无关的,代码二里我注释了关键代码var a = 2,代码运行结果发生了变化,程序报错了,的确很让人困惑...其实这个变量任然被定义即内存存储里有了标示符,只不过没有被赋值,代码一则说明,内部变量a已经和外部环境无关,怎么回事?如果我们按照代码运行是按照顺序执行的逻辑来理解,这个代码也就没法理解。...所以,引子里的代码在函数的局部作用域下变量a被重新定义了,在预加载时候a的作用域范围也就被框定了,a变量不再属于全局变量,而是属于函数作用域,只不过赋值操作是在运行期执行(这就是为什么javascript...变量名称不管在那个作用域有效,堆区的存储的函数都是在全局执行环境时候就被固定下来了,变量的名字只是一个指代而已。
作用域【废话部分,有基础直接看面试题部分】 什么是作用域 啥是作用域呢,简单的说,就是变量可以生效的地方,就叫做作用域,也叫执行环境,大家也可以理解为变量可以发生作用的地方。...全局作用域 全局作用域就是代码运行时最外围的执行环境,比如在我国,最大的范围就是全国,全国就是全局作用域,而在js中,全局作用域被认为是window对象,而在上一篇文章中我们也说到了,在全局作用域中声明的变量为全局变量...另外要说一点,在我们讲this的那一篇文章中说了,this是在函数调用时决定的,在函数被定义时并没有this。而作用域则刚好相反,作用域是在函数定义时决定的,跟函数在哪里被调用没有关系。...那有的同学会说,这不是有块级作用域吗,那为什么又说没有块级作用域呢?我们又怎么区分有没有块级作用域呢?其实很简单,我们来看看代码就知道了。...,为什么呢,但仔细一看其实很简单,因为setTimeout里面那个未命名函数也有自己的作用域,它接收一个参数i,其实就是在自己的作用域里定义了一个空的变量i,所以打印的时候在当前作用域里可以找到变量i,
变量对象就是执行上下文和作用域链中间的桥梁。 剧透一下,神秘的 this 就存在于执行上下文环境之中! 当然,之后我会单独用几节来彻底讲明白 this 到底是什么(其实 this 很简单)。...,例如在全局上下文环境的变量对象会有一个属性 window (DOM 中) 可以引用变量对象自身,全局上下文环境的另一个属性 this 也指向全局上下文环境的变量对象。...在 DOM 中,全局对象的 window 属性可以引用全局对象自身,全局上下文环境的 this 属性也可以引用全局对象。...因此,在全局上下文环境中,变量对象用全局对象来表示。...总结 这一节中我们讲了变量对象,下一节就是我们的重头戏 - 作用域链。希望大家可以持续关注我,我们一起进步。
变量对象就是执行上下文和作用域链中间的桥梁。 剧透一下,神秘的 this 就存在于执行上下文环境之中! 当然,之后我会单独用几节来彻底讲明白 this 到底是什么(其实 this 很简单)。...,例如在全局上下文环境的变量对象会有一个属性 window (DOM 中) 可以引用变量对象自身,全局上下文环境的另一个属性 this 也指向全局上下文环境的变量对象。...在 DOM 中,全局对象的 window 属性可以引用全局对象自身,全局上下文环境的 this 属性也可以引用全局对象。...代码是如何被处理的 在第1节中我们讲过js 代码的编译过程,其中有一步叫作预编译,是说在代码执行前的几微秒会首先对代码进行编译,形成词法作用域,然后执行。...总结 这一节中我们讲了变量对象,下一节就是我们的重头戏 - 作用域链。希望大家可以持续关注我,我们一起进步。
可这是为什么呢?为什么多线程代码如此难以正确编写呢? 从根源上思考 关于这个问题,本质上是有一个词语你没有透彻理解,这个词就是所谓的线程安全,thread safe。...关你什么屁事 生活中我们口头上经常说的一句话就是“关你屁事”,大家想一想,为什么我们的屁事不关别人? 原因很简单,这是我的私事啊!...如果使用的全局资源只在程序运行时初始化一次,此后所有代码对其使用都是只读的,那么没有问题,就像这样: int global_num = 100; //初始化一次,此后没有其它代码修改其值 int func...为什么呢? 其实在上一篇文章中我们讲过,被__thread关键词修饰过的变量放在了线程私有存储中,Thread Local Storage,什么意思呢?...不使用任何全局资源,只使用线程私有资源,这种通常被称为无状态代码 线程局部存储,如果要使用全局资源,是否可以声明为线程局部存储,因为这种变量虽然是全局的,但每个线程都有一个属于自己的副本,对其修改不会影响到其它线程
JavaScript的垃圾回收原理就是:固定时间间隔,周期性的释放不在使用的变量所占内存。全局变量的生命周期直至浏览器卸载页面才会结束,局部变量只在函数的执行过程中存在。...我觉得重点就是全局变量的生命周期直至浏览器卸载页面才会结束,局部变量只在函数的执行过程中存在。当然,这可能讲闭包的时候用到,现在就讲GC。...垃圾回收有两个办法,给出的解释是: 标记清除 垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了...,因为环境中的变量已经无法访问到这些变量了,然后垃圾回收器相会这些带有标记的变量机器所占空间。...简单点来说就是有没有被引用,没有被引用的就会被回收,比如一个方法里面的变量,运行之后这个方法不再被使用就会被回收。
准备 今天我们只看核心代码 所以我们进入example 这个 JS 文件里面去 这个案例非常的简单,一共就17行代码 运行第四行作者给我们的命令 node example 我们发现没有反应,那么这是怎么一回事呢...如果没有需要的数据,就给他抛出个错误 接下来把需要的数据挂载到实例对象身上 检查更新时间是否符合规范 知识点:process.env 是 Node.js 中的一个环境对象。...其中保存着系统的环境的变量信息。...,里面保存着系统的环境的变量信息 ConfigStore可以进行持久化存储 Chalk可以让你的终端更好看 spawn可以生成一个子进程去执行命令 is-installed-globally可以检查你的软件包是否已全局安装...is-yarn-global可以检查你全局安装的是否是通过yarn安装的 在终端中画框框可以用 boxen isCi的作用可以判断当前环境是持续集成服务器 latestVersion可以获取最新版本的
我们来看这段代码,我自以为是的又加了一层,于是,我希望不用我说,你也已经懂了。 最后,再说一下,为什么赋值给一个其它名字的变量以及用对象的方法来使用的时候,重定义永远没有发生。...个人理解,因为你每次在执行的时候,赋值的动作是有的,但是并没有把我覆盖,所以,每次都是重定义,每次都无法执行新的内部逻辑。...,那么days、today和msg等变量将会成为全局变量,并遗留在初始化代码中。...Zaking",new Date())); 一般情况下,全局对象是以参数方式传递给即时函数的,以便于在不使用window指定全局作用域限定的情况下可以在函数内部访问该对象,这样将使得代码在浏览器环境之外时具有更好的操作性...,即时函数返回的值是一个函数,它将分配给变量getResult,并且将简单的返回res值,该值被预计算并存储在即时函数的闭包中。
在词法环境中,有两个组成部分:(1)环境记录(environment record) (2)对外部环境的引用 环境记录是存储变量和函数声明的实际位置。 对外部环境的引用意味着它可以访问其外部词法环境。...(实现作用域链的重要部分) 词法环境有两种类型: 全局环境(在全局执行上下文中)是一个没有外部环境的词法环境。全局环境的外部环境引用为 null。...它拥有一个全局对象(window 对象)及其关联的方法和属性(例如数组方法)以及任何用户自定义的全局变量,this 的值指向这个全局对象。 函数环境,用户在函数中定义的变量被存储在环境记录中。...JavaScript引擎,如果没有查找到,那么继续在变量环境中查找。...引用类型数据保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中。 为什么基本数据类型存储在栈中,引用数据类型存储在堆中?
threading.local()可以创建一个线程安全的全局变量,即在一线程中的修改不会影响另一线程。...结合代码说明: ? 通过修改代码验证“名同实不同”: ? 所以threading.local()是通过创建“名同实不同”的“全局变量”。...这时,将其变成“名同实不同"的全局变量,显然要比在每个视图函数中都传入一个request参数来得方便。...为什么要有LocalStack 按前文所述,通过LocalProxy存储的是“名同实不同”的变量。...在作为一个简单的网站后台时,一般不会有这种情况,因为一个HTTP请求对于一个request 环境和一个 application 环境。但是,在离线测试的时候,可能会推入栈中多个context。
领取专属 10元无门槛券
手把手带您无忧上云