作用域

var、let和const应该怎么用?

泄露秘密 提交于 2019-12-07 16:49:49
在这篇文章中,我们将介绍两种新的在JavaScript(ES6)中创建变量的方式,即使用let和const。同时,我们将探讨var、let和const之间的区别,以及函数与块作用域、变量提升和不变性等内容。 如果你想观看视频,这是链接: https://youtu.be/6vBYfLCE9-Q ES2015(或ES6)引入了两种创建变量的新方法:let和const。但在我们深入了解var、let和const之间的区别之前,需要先了解一些先决条件。它们是变量声明与初始化、作用域(特别是函数作用域)和变量提升。 变量声明与初始化 变量声明引入了新标识符。 var declaration 我们创建了一个叫作declaration的新标识符。在JavaScript中,刚创建的变量会被初始化为undefined。如果我们在控制台打印变量declaration,将会看到输出undefined。 var declaration console.log(declaration) 与变量声明相反,变量初始化是指首次为变量赋值。 var declarationconsole.log(declaration) // undefineddeclaration = 'This is an initialization' 我将一个字符串赋值给declaration变量,以此来初始化它。

ES6 系列之 let 和 const

五迷三道 提交于 2019-12-07 16:49:33
块级作用域的出现 通过 var 声明的变量存在变量提升的特性: if (condition) { var value = 1; } console.log(value); 初学者可能会觉得只有 condition 为 true 的时候,才会创建 value,如果 condition 为 false,结果应该是报错,然而因为变量提升的原因,代码相当于: var value; if (condition) { value = 1; } console.log(value); 如果 condition 为 false,结果会是 undefined。 除此之外,在 for 循环中: for (var i = 0; i < 10; i++) { ... } console.log(i); // 10 即便循环已经结束了,我们依然可以访问 i 的值。 为了加强对变量生命周期的控制,ECMAScript 6 引入了块级作用域。 块级作用域存在于: 函数内部 块中(字符 { 和 } 之间的区域) let 和 const 块级声明用于声明在指定块的作用域之外无法访问的变量。 let 和 const 都是块级声明的一种。 我们来回顾下 let 和 const 的特点: 1.不会被提升 if (false) { let value = 1; } console.log(value); //

详解JavaScript中的函数与闭包

我是研究僧i 提交于 2019-12-07 15:54:03
闭包这东西,说难也难,说不难也不难,下面我就以自己的理解来说一下闭包。 一、闭包的解释说明 对于函数式语言来说,函数可以保存内部的数据状态。对于像C#这种编译型命令式语言来说,由于代码总是在代码段中执行,而代码段是只读的,因此函数中的数据只能是静态数据。函数内部的局部变量存放在栈上,在函数执行结束以后,所占用的栈被释放,因此局部变量是不能保存的。 Javascript采用词法作用域,函数的执行依赖于 变量作用域 , 这个作用域是在定义函数时确定的 。因此Javascript中函数对象不仅保存代码逻辑,还必须引用当前的作用域链。Javascript中函数内部的局部变量可以被修改,而且当再次进入到函数内部的时候,上次被修改的状态仍然持续。这是因为因为局部变量并不保存在栈上,而是通过一个对象来保存。 决定使用哪个变量是查找作用域链后决定的。 1.每次 定义函数时 ,都会为之创建一个作用域链; 2.每次 调用函数时 ,会创建一个新的对象用来保存变量(局部变量和参数),并且把这个用于保存变量的对象加入作用域链前端。 如果没有局部变量的话,这个保存变量的对象就只包含arguments,也就是用来保存参数。设想这么一种情况,如果内层函数定义时恰逢外层函数正被调用执行,那么内层函数就会把外层函数运行时这个保存变量的对象纳入自己的作用域链中。 用代码来举例,外层匿名函数执行了10次

js中的匿名函数和闭包总结篇

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 15:52:23
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。 一.匿名函数 //普通函数 function box () { //函数名是box return 'Lee' ; } //匿名函数 function () { //匿名函数,会报错 return 'Lee' ; } //通过表达式自我执行 ( function () { //封装成表达式 alert( 'Lee' ); })(); ( function (age) { //封装成表达式 alert(age); })( 100 ); //()表示执行函数,并且传参 //第一圆括号放匿名函数,第二个圆括号执行; //把匿名函数赋值给变量 var box = function () { //将匿名函数赋给变量 return 'Lee' ; }; alert(box()); //调用方式和函数调用相似 //注意上面的括号 //函数里的匿名函数 function box () { return function () { //函数里的匿名函数,产生闭包 return 'Lee' ; } } alert(box()()); //调用匿名函数 二.闭包 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。 //通过闭包可以 返回局部变量

javascript 匿名函数与闭包

元气小坏坏 提交于 2019-12-07 15:50:40
匿名函数 普通函数: function box () { return 'Lee' ; } alert(box()); 匿名函数: //单独的匿名函数 会报错 无法运行 也无法调用 //function() { // return 'Lee'; //} //通过表达式的自我执行 ( function () { alert( 'Lee' ); })(); //把匿名函数赋值给变量 var cat = function () { return 'Lee' ; }; alert(cat()); //调用 //把匿名函数自我执行的返回值赋值给变量 var box = ( function () { return 'Lee' ; })(); alert(box); //自我执行匿名函数的传参 ( function (num) { alert(num); })( 100 ); 闭包 闭包指有权访问另一个函数作用域里变量的函数 //函数里放一个匿名函数 ---闭包 function box () { return function () { return 'Lee' ; } } alert(box); // function box () { return function () { return 'Lee' }} alert(box());// function () { return

javascript函数闭包

醉酒当歌 提交于 2019-12-07 15:50:10
1. 事件闭包的理解 闭包是指有权限访问另一个函数作用域中的变量的函数。 在 javascript 语言中,闭包就是函数和该函数作用域的组合。从这 个概念上来讲,在 js 中,所有函数都是闭包(函数都是对象并且函 数都有和他们相关联的作用域链 scope chain)。 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的 环境的表达式(通常是一个函数),因而这些变量也是该表达式的一 部分。其实这 句话通俗的来说就是:JavaScript 中所有的 function 都是一个闭包。 不过一般来说,嵌套的 function 所产生的闭包更为强大,也是大部 分时候我们所谓的“闭包”。 2. 变量的作用域 要理解闭包,首先必须理解 Javascript 特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript 语言的特殊之处,就在于函数内部可以直接读取全局 变量。 案例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> // 闭包: 在js中任何一个函数都是一个闭包,但是嵌套的函数闭包作用会更大; // 闭包: 一个函数中的变量 可以被其他函数所访问 //问题: 如何从外部读取函数内部的变量? /

Python作用域

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 15:27:29
一、全局作用域   --全局作用域在程序执行时创建,程序执行结束销毁     --所有函数意外的区域都是全局作用域 二、全局变量(包含函数在内)   --在全局作用域定义的变量都是全局变量,全局变量可以在程序的任意位置访问 三、函数作用域   --局部作用域在函数被调用时创建,函数结束时销毁   --函数内部的区域叫做函数作用域   --函数每访问一次都会产生一个新的作用域。   四、局部变量(包含函数在内    )   --在函数内部定义的变量叫做局部变量,局部变量只能在函数内部被访问,且函数结束时变量被销毁。   五、变量的使用   --当我们使用变量时,会优先在当前作用域寻找变量,  当不存在时,去上一级作用域寻找。当在全局作用域依然没有找到,则会抛出异常。   六、命名空间   --变量都保存在命名空间中,不同的作用域有不同的命名空间。其本质就是一个字典,内部保存变量以及变量的值,  可以通过locals()函数来查看当前作用域的命名空间。可以通过locals()函数来操作命名空间内部的变量。    --全局命名空间,可以通过glocals()函数在任意位置获取全局变量,全局命名空间中获取不到局部变量   --函数命名空间,通过locals()函数获取当前命名空间内的变量,可以通过glocals获取全局变量             来源: https://www

局部变量与全局变量

自作多情 提交于 2019-12-07 09:06:51
变量作用域:变量的可用范围 按照作用域的不同,变量可以分为:局部变量和全局变量 特点:不同作用内出现同名变量,内部作用域的变量会覆盖外部作用的变量 局部变量:定义在函数内部的变量以及函数的形参称为局部变量 作用域:从定义哪一行开始直到与其所在的代码块结束 生命周期:从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域 特点: 1、相同作用域内不可以定义同名变量 2、不同作用范围可以定义同名变量,内部作用域的变量会覆盖外部作用域的变量 Int main(){ int age = 5; if(age==5){ int height = 1; }// height的作用域在此处就结束了 printf(“年龄为:%d”,age);//对 printf(“身高为:%d”,height);//错 } Int main(){ char *home = “你家”; char *harry = “外边的流浪狗”; if(strcmp(home,”你家”)==0){ char *harry= “你们家的狗”; printf(“harry = %s”,harry); //输出 你们家的狗 } } 全局变量:定义在函数外边的变量称为全局变量 作用域范围:从定义哪行开始直到文件结尾 生命周期:程序一启动就会分配存储空间,直到程序结束 存储位置:静态存储区 Int num = 10 /

解决Spring中singleton的Bean依赖于prototype的Bean的问题

杀马特。学长 韩版系。学妹 提交于 2019-12-07 08:42:30
当Spring容器中作用域不同的Bean相互依赖时,可能出现一些问题,例如:一个作用域为Singleton的Bean(设为A)依赖于一个作用域为prototype的Bean(设为B)。由于A是单例的,只有一次初始化的机会,它的依赖关系也只在初始化阶段被设置,但它所依赖的B每次都会创建一个全新的实例,这将使A中的B不能及时得到更新。这样将导致如果客户端多次请求A,并调用A中B的某个方法(或获取A中B的某个属性),服务端总是返回同一个B, 但客户端直接请求B却能获得最新的对象,这就产生了对象不同步的情况。 这样就违背了B初衷:本来希望B具有prototype的行为,但是却表现出singleton的行为了。那么,问题如何解决呢? 办法有二: 部分放弃依赖注入:当A每次需要B时,主动向容器请求新的Bean实例,即可保证每次注入的B都是最新的实例。 利用方法注入。 第一种方式显然不是一个好的做法,代码主动请求Bean实例,必然导致代码与SpringAPI耦合在一起,造成严重的代码污染。通常情况下,我们会采用第二种做法。使用方法注入。 方法注入通常使用lookup方法注入,利用lookup方法注入可以让Spring容器重写容器中Bean的抽象或具体方法,返回查找容器中其他Bean的结果,被查找的Bean通常是一个non-singleton的Bean(尽管也可以是一个singleton的Bean

JavaScript作用域

丶灬走出姿态 提交于 2019-12-06 19:56:27
一、“JavaScript中无块级作用域” function Main(){ if(1==1){ var name = 'seven'; } console.log(name); } // 输出: seven 补充:标题之所以添加双引号是因为JavaScript6中新引入了 let 关键字,用于指定变量属于块级作用域。 二、JavaScript采用函数作用域 在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量。 function Main(){ var innerValue = 'seven'; } Main(); console.log(innerValue); // 报错:Uncaught ReferenceError: innerValue is not defined 三、JavaScript的作用域链 由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。 xo = 'alex'; function Func(){ var xo = "seven"; function inner(){ var xo = 'alvin'; console.log(xo); } inner(); } Func(); 如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序,对于上述实例: