作用域

关于作用域

流过昼夜 提交于 2019-12-05 15:20:13
运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁。 查找变量:从作用域链的顶端依次向下寻找。 [ [scope ] ]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供JavaScript引擎存取,[ [scope ] ]就是其中一个。[ [scope ] ]指的就是我们所说的作用域,其中存储了运行期上下文的集合。 作用域链:[ [scope ] ]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。 来源: https://www.cnblogs.com/xbzxx/p/11930656.html

面试知识-js

折月煮酒 提交于 2019-12-05 15:19:54
1.函数声明和变量声明的提升;函数声明会被提升到普通变量之前。变量的声明被看作两部分,第一个是编译阶段的任务,第二个是执行阶段的任务。 2.作用域分为两部分:1.函数作用域,2块级作用域。 3. 来源: https://www.cnblogs.com/xiao-peng-ji/p/11930605.html

NodeJS学习————关于let和const命令的使用理解

徘徊边缘 提交于 2019-12-05 15:16:09
let的基本用法 在新的js规范ES6中,新增了 let 命令,用来声明变量。用法类似于var,但不同的是所声明的变量,只在 let 命令所在的代码块内有效。 { let a = 10 ; var b = 10 ; } //ReferenceError: a is not defined console . log ( a + b ); 在之前的js版本中,通过var命令声明的变量可以在声明之前使用,只不过是undefined console . log ( a ) // 输出undefined var a = 10 ; 这种现象被称为“变量提升”,即变量可以在声明之前使用,值为undefined。而通过let声明的变量,无法在声明之前使用,如果这么做了,则会报xx is not defined错误。 而变量声明之前的代码块,都被称为“暂时性死区”,即变量无法使用的地方。与var声明的全局变量不同,let被设计为一种在局部使用的变量声明命令,使它所声明的变量更具有可操作性。与Java中声明变量的方式非常类似。 一些隐蔽的死区,不容易发现,如: function bar ( x = y , y = 2 ) { return [ x , y ]; } bar (); 输出如下: for循环中的let变量 for循环的计数器,非常适合使用let命令。 for ( let i = 0 ;

python中的函数作用域

半城伤御伤魂 提交于 2019-12-05 14:53:11
1.作用域的介绍:# 也叫名称空间 全局名称空间:创建的储存"变量名与值的关系"的空间叫做全局名称空间 # 局部名称空间:在函数的运行中开辟出来的空间叫做局部名称空间 #并非单指函数,例如在模块中,在类中的简单赋值操作都是局部作用域 内置名称空间:内置名称空间中存放了python解释器为我们储存的的函数,例如len(),print(),list()...都是python为我们创建好的内置函数。 python中的作用域分4中情况: * L : local,局部作用域,函数中定义的变量 * E : enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的(闭包常见) * G : globa,全局变量,是模块级别定义的变量 * B : bulit-in,系统固定模块里的变量,就是内置空间定义的 int(),print(),list() 加载变量的优先级顺序依次是:python内置作用域>当前模块中的全局(文件从上而下读取)>外层作用域>局部作用域 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEJB local 和 enciosing 是相对的,enclosing 变量相对上层来说也是 local 内置作用域 : x = int(2.9)# int就是内置作用域。(bulit-in)

let和var,const的区别(非原创/自己整理成了适合自己看的样子)

让人想犯罪 __ 提交于 2019-12-05 13:59:19
var var定义的变量是全局变量或者函数变量。 var定义的变量范围最少是一个函数之内。 for(var i = 0 ; i <10 ;i++){ setTimeout(() => { //回调函数 到异步队列中 console.log(i); //执行此代码时,for循环已经执行完毕 }, i*500); } //输出结果是 10个10 //知识点:JS的事件循环机制,setTimeout的机制    var a = 1 ; //全局变量 function fn() { var a = 2; //函数fn的局部变量 console.log(a); //2 } fn(); console.log(a); //1    若在函数内部定义时不写var,这个变量就会变成全局变量: var a = 1 ; //全局变量 function fn() { a = 2; //此时变成全局变量 console.log(a); //2 } fn(); console.log(a); //2 //因为代码是由上至下执行的,2将1覆盖,所以两个结果都是2    var变量存在提升 //代码块1console.log(a); // 结果为 underfined var a = 2; //代码块2var a; console.log(a); // 结果为 underfined a = 2;

JS三座大山再学习(二、作用域和闭包)

…衆ロ難τιáo~ 提交于 2019-12-05 13:39:16
原文地址 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' console.log(name); //波妞 function fun(){ console.log(name); //波妞 console.log(eat) //ReferenceError: eat is not defined (function(){ console.log(like) //宗介 var eat = '肉' })() } fun(); name定义在全局,在全局可以访问到,所以 (2) 打印能够正确打印; 在函数fun中,如果没有定义name属性,那么会到它的父作用域去找,所以 (3) 也能正确打印。 内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境的任何变量和函数。类似 单向透明 ,这就是作用域链,所以 (4) 不行而 (5) 可以。 那么问题来了,为什么第一个打印是"undefined",而不是"ReferenceError: name is not defined"。原理简单的说就是JS的 变量提升 变量提升: JS在解析代码时,会将所有的声明提前到所在作用域的最前面 栗子2 console.log(name); //undefined

一篇文章看懂JS闭包,都要2020年了,你怎么能还不懂闭包?

北战南征 提交于 2019-12-05 10:03:59
壹 ❀ 引 我觉得每一位JavaScript工作者都无法避免与闭包打交道,就算在实际开发中不使用但面试中被问及也是常态了。就我而言对于闭包的理解仅止步于一些概念,看到相关代码我知道这是个闭包,但闭包能解决哪些问题场景我了解的并不多,这也是我想整理一篇闭包的原因。我们来看一段代码,很明显这是一个闭包,那么请问闭包指代的是下方代码中的哪一部分呢?本文开始。 function outer() { let name = '听风是风'; function insider() { console.log(`欢迎来到${name}的博客`); }; return insider; }; outer()(); //欢迎来到听风是风的博客 贰 ❀ 什么是闭包? 如果在面试中被问及什么是闭包,大部分情况下得到的答复是(至少我以前是) A函数嵌套B函数,B函数使用了A函数的内部变量,且A函数返回B函数,这就是闭包 。 这段描述当然没问题,那么为了让下次面试回答的更为漂亮,就让我们从更专业的角度重新认识闭包。 1.闭包起源 闭包翻译自英文单词 closure ([ˈkloʊʒər] 倒闭,关闭,停业) ,闭包的概念最早出现在1964 年的学术期刊 《The Computer Journal》 上,由 P. J. Landin 在 《 The mechanical evaluation of

JavaScript之作用域和闭包

▼魔方 西西 提交于 2019-12-05 09:59:27
一、作用域 作用域共有两种主要的工作模型:第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另外一种叫作动态作用域; JavaScript所采用的作用域模式是词法作用域。 1.词法作用域 词法作用域意味着作用域是由书写代码时函数声明的位置来决定的。编译的词法分析阶段基本能够知道全部标识符在哪里以及是如何声明的,从而能够预测在执行过程中如何对它们进行查找。 JavaScript 中有两个机制可以“欺骗”词法作用域: eval(..):可以对一段包含一个或多个声明的“代码”字符串进行演算,并借此来修改已经存在的词法作用域(在运行时) ; with:通过将一个对象的引用当作作用域来处理,将对象的属性当作作用域中的标识符来处理,从而创建了一个新的词法作用域(同样是在运行时) 。 这两个机制的副作用是引擎无法在编译时对作用域查找进行优化,因为引擎只能谨慎地认为这样的优化是无效的。使用这其中任何一个机制都将导致代码运行变慢。 2.函数作用域和块级作用域 函数作用域: 函数是 JavaScript 中最常见的作用域单元。本质上,声明在一个函数内部的变量或函数会在所处的作用域中“隐藏”起来,即函数内定于的函数和变量为该函数私有; 块级作用域: 块作用域指的是变量和函数不仅可以属于所处的作用域,也可以属于某个代码块(通常指 { .. } 内部)

十一、微信小程序-var、let、const用法详解

两盒软妹~` 提交于 2019-12-05 09:10:21
let命令 基本用法 ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。 for循环的计数器,就很合适使用let命令。 for (let i = 0; i < 10; i++) { // ... } console.log(i); // ReferenceError: i is not defined 上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。 下面的代码如果使用var,最后输出的是10。 var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10 上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log

【转帖】Eclipse快捷键指南

戏子无情 提交于 2019-12-05 07:05:36
编辑 作用域 功能 快捷键 全局 查找并替换 Ctrl+F 文本编辑器 查找上一个 Ctrl+Shift+K 文本编辑器 查找下一个 Ctrl+K 全局 撤销 Ctrl+Z 全局 复制 Ctrl+C 全局 恢复上一个选择 Alt+Shift+↓ 全局 剪切 Ctrl+X 全局 快速修正 Ctrl1+1 全局 内容辅助 Alt+/ 全局 全部选中 Ctrl+A 全局 删除 Delete 全局 上下文信息 Alt+? Alt+Shift+? Ctrl+Shift+Space Java编辑器 显示工具提示描述 F2 Java编辑器 选择封装元素 Alt+Shift+↑ Java编辑器 选择上一个元素 Alt+Shift+← Java编辑器 选择下一个元素 Alt+Shift+→ 文本编辑器 增量查找 Ctrl+J 文本编辑器 增量逆向查找 Ctrl+Shift+J 全局 粘贴 Ctrl+V 全局 重做 Ctrl+Y 查看 作用域 功能 快捷键 全局 放大 Ctrl+= 全局 缩小 Ctrl+- 窗口 作用域 功能 快捷键 全局 激活编辑器 F12 全局 切换编辑器 Ctrl+Shift+W 全局 上一个编辑器 Ctrl+Shift+F6 全局 上一个视图 Ctrl+Shift+F7 全局 上一个透视图 Ctrl+Shift+F8 全局 下一个编辑器 Ctrl+F6 全局 下一个视图