全局变量、局部变量、闭包详解

 1.全局变量和局部变量

1.在函数中的局部变量和全局变量重名,局部变量会覆盖全局变量。

2.变量提升: Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),先获取所有被声明的变量再逐一执行,所有变量的声明语句都会被提升到当前代码块的头部,但是不能对变量定义做提前解析。 注:代码块指的是function的一个{},通常的if、while、for的{}中变量不会提升。

         

全局变量的优点:

1.可以减少变量的个数,减少由于实参和形参的数据传递带来的时间消耗。

缺点:

1.全局变量保存在静态存储区,程序开始运行时为其分配内存,程序结束运行时释放其内存。相比较而言生命周期长,且数量较多时,会占用较大的内存。

2.使用全局变量会破坏函数的封闭性和独立性,导致函数的可移植性降低。

3.当一个全局变量多次被不同的语句(函数)操作,全局变量的值容易变得不清晰,这便降低了程序的可读性,不利于在编码后进行调试和查错之类的操作。

局部变量的优点:

1.局部变量是程序动态分配内存的,所以生命周期短,不会造成长时间占用过多内存的情况。

2.局部变量定义在函数内部,限于函数内部调用,故能够有效的保证函数的封闭性。

3.即使在多个函数内部定义了多个同名局部变量,它们之间也不会相互影响。

缺点:

1.局部变量中的数据在函数执行完后就会消失,故不利于数据的保留。

2.局部变量的使用范围有限,仅限于所属函数的内部。

2.闭包

其实就是一个层级关系,假设函数parent里面没有返回函数child,那么,你就访问不到函数child。这就形成了一个闭包。

注意一定要先访问父函数,才能访问到子函数,假设父函数没有执行子函数,也一样访问不到子函数。

               

子函数继承父函数变量, b2函数里的++i可以获得i的值变为1000, 父函数不可以读取子函数变量。

如果当window通过b1可以直接访问到++i的值了,就说明是闭包了

闭包一般都是必须有return 返回值的

闭包的时候,因为是引用关系,b2执行时,必须要有b1的i变量,而当执行b1函数的时候,是引用关系,所以,这是2个函数中的变量是互相使用的,系统不会删除变量。

所以,闭包的最好的理解就是:函数内部变量(局部变量)可以被外部读取的函数,称为闭包。

循环中的闭包

输出数字 10 十次,当 console.log 被调用的时候,匿名函数保持对外部变量 i 的引用(函数内部的变量都是局部变量,函数执行后,就会被系统删除),此时 for循环已经结束, i 的值被修改成了 10.

输出0到9

外部的匿名函数会立即执行,并把 i 作为它的参数,此时函数内 e 变量就拥有了 i 的一个拷贝。当传递给 setTimeout 的匿名函数执行时,它就拥有了对 e 的引用,而这个值是不会被循环改变的。

             

使用闭包需要注意以下两点:

1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2.闭包会在父函数外部,改变父函数内部变量的值。

原文地址:https://www.cnblogs.com/apple-p/p/8360880.html

时间: 2024-11-10 00:27:43

全局变量、局部变量、闭包详解的相关文章

Swift 中的Closures(闭包)详解

Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中,同样有这样的一个角色,用于当开发者需要异步执行的之后使用的一种语法 - Closure.中文翻译为闭包. 闭包出了可以进行异步执行之外,它的完整使用还依赖闭包本身的变量.常量的捕获.闭包捕获并存储对它们定义的上下文中的任何常量和变量的引用,这也就意味着,你可以在任何时候异步执行闭包的时候获取之前的所

PHP中的闭包详解

PHP闭包(Closure)使用详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-02我要评论 本篇文章介绍了,PHP闭包(Closure)的使用介绍,需要的朋友参考下 不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后.在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣. 于是乎在网上下了个WAMP集成开发环境,是PHP5.3版本的(PHP5.3开始引入了闭包的特性),不得不说WAMP安

js闭包详解-转自好友trigkit4

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript语言的一

JavaScript 闭包详解

闭包的特性 闭包有三个特性: 1.函数嵌套函数2.函数内部可以引用外部的参数和变量3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量. 一般函数执行完毕后,局部活动对象就被销毁,内存中仅

js闭包详解

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript语言的一

javascript中局部变量和全局变量的区别详解

javascript有两种变量:局部变量和全局变量.当然,我们这篇文章是帮助大家真正的区别这两种变量. 首先,局部变量是指只能在本变量声明的函数内部调用.全局变量时整个代码中都可以调用的变量.当然,单单从字面上理解肯定是不清楚的,下面我详细的介绍下: 大家都知道,变量是需要用var关键字声明的.但是javascript中也可以隐式的使用变量,就是不用声明,直接使用.而且,千万注意,javascript把隐式声明的变量总是当成全局变量来使用的. 例如: 代码如下: function myName(

javascript闭包详解(内容为转载的,觉得不错就分享一下)

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

JavaScript的闭包详解

(1)定义: 函数内部返回一个函数,返回出来的这个函数叫做被我们称之为闭包(个人理解的最简单的表现形式,) (2)为什么要使用闭包呢? 局部变量在函数执行完之后就会被GC回收,有时候我们想在外部访问内部的变量,这个时候就用到了闭包 (3)闭包有两个作用: a.访问函数内部的变量(函数作为返回值) b.保存作用域(函数作为参数传递) 1 //1.访问函数内部的变量(函数作为返回值) 2 function test(){ 3 var age = 18; 4 return function(){ 5

javascript函数及闭包详解

1.arguments[]对象在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们.还可以用 arguments 对象检测函数的参数个数,引用属性 arguments.length 2function对象的length属性ECMAScript 定义的属性 length 声明了函数期望的参数个数 3Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法.这两个方法返回的都是函数的源代码,在调试时尤其有用 4闭包: 什么时