函数闭包--JavaScript权威指南--基础篇4

函数JavaScript权威指南–基础篇4
一.知识点–函数–闭包
1.要理解函数闭包,要先知道几个概念:
①块级作用域和函数作用域的概念

  • FAQ:什么是块级作用域?

在类C语言中是这么定义的:变量的作用域由花括号限定,称为块级作用域。在块级作用域下,所用变量都在定义的花括号内,从定义开始到花括号结束这个范围内可以使用,出了这个范围就访问不到了。
C#例子:

void Main(string[] args)
    {
     if(true)
     {
      int a = 10;
     }
     System.Console.WriteLine(a);//访问不到a
    }

②变量作用域和函数作用域链

  • FAQ:什么是变量作用域?

一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。在函数内声明的变量只在函数体内有定义,是局部变量,作用域也就只在函数内。
打个比方,全局变量比作景区通票,可以游览整个景区,而局部变量就好比景区内单独收费的特殊项目,只有你交了这个特殊项目的钱,才能去玩。

  • FAQ:什么是函数作用域?

在JS中没有块级作用域,取而代之使用函数作用域(function scope):变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

  • FAQ:什么是作用域链?

理解作用域链前先要知道,JavaScript是基于词法作用域的语言:通过阅读包含变量定义在内的数行源码就能知道变量的作用域。全局变量在程序中始终是有定义的,局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。
那么,什么是作用域链呢?你可以把它理解为一些对象的集合或链表,这些对象可以被函数或全局代码块来访问。当函数或代码块访问属性时,会遍历这个对象的集合,从调用最先执行的对象里找属性,依次遍历集合里的对象,直到全局对象,找不到属性时抛出异常。

  • FAQ:什么是闭包?

那么,问题终于可以解决了,什么是闭包呢?
当一个函数内嵌套了另一个函数,那么外部的函数就又多了一个函数作用域,作用域链又多了对象,按照作用域链的特性,嵌套函数是可以访问到包含它的外部函数的变量的,此时,嵌套函数就可以对这些变量做一些操作,再把变量作为返回值返回。当外部函数将嵌套的函数对象作为返回值返回的时候,任何时候在全局下调用这个外部函数,都能访问到其内部的变量,这就构成闻名江湖的闭包啦~
③例子
例子1.1:访问不到局部变量n
 

 function f(){
    var n=111;
  }
  alert(n); // error

例子1.2:闭包-访问局部变量

function f(){
    var n = "local scope";//局部变量
    function fn(){//对局部变量n进行操作
        n= 111;
        return n;
    }
    return fn();//f将嵌套函数fn的执行结果作为返回值返回
}
var a = f();
console.log(a);//111

此时在全局下就能访问到局部变量n了,并且局部变量n始终保持在内存中。
例子2:拓展–关于未声明的变量

console.log('第一次a=',a);//undefined
if(!"a" in window){//不进去
    var a = "111";
    console.log('第二次a=',a);
}
console.log('第三次a=',a);//undefined
/**执行顺序相当于:
 * var a;
 * console.log('第一次a=',a);
 * console.log('第三次a=',a);
 * **/

当访问了一个未声明的变量时,JavaScript会在全局自动定义一个变量,所以在执行语句之前,已经声明了变量a,那么if()语句是不进去的。所以输出a的值为undefined。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值