javascript作用域与闭包

一、javascript的作用域

在java中,我们通常以一个“{}”表明作用域,定义在某一个“{}”里的对象无法在“{}”外使用。而在javascript里,定义对象也是有一定的作用域的。与java不同,javascript作用域分为三大类。

1、全局作用域

定义在全局的对象其作用域也是全局的。简单来说定义在外部的全局对象在任意位置都可以调到。这里要注意一下,区别全局作用域和函数作用域。注意:

a、循环结构和判断结构等都不会独立一块作用域。 例如在for(){}循环内var一个对象,其作用域是全局的,与java不同并不仅仅限制于for(){}循环中。

b、如何判断所属作用域范围:就看这个结构是在全局所定义还是在函数中定义

2、函数作用域

在函数中定义作用范围仅在该函数内。这一部分很好理解,在函数中定义的对象就只能在该函数范围内使用,在外部无法调用。

3、catch作用域

定义在try{}catch{}的catch中的对象,作用域仅在catch中,catch块具有独立的作用域。

二、函数的嵌套与闭包

在了解函数的嵌套之前我们先来了解一下函数。函数用function声明,function声明的可以是函数、构造函数或者是类。

注意:定义变量方式声明函数和传统声明函数区别,在定义变量方式声明函数中,函数体不会预编译,而在传统声明函数方式中,会提前预编译这个函数的定义过程。举一个简单的例子:


在这段代码中,函数a1使用的变量方式声明,函数a2使用的传统方式声明,在声明前调用了这两个函数,这里可以很明显的看到a1();呈现灰色,a2();为正常。运行结果是a1;会报错,而注释掉a1部分a2可以正常运行(这里就不截图了)。

当一个函数内声明了函数变量时,要通过其声明方式判断其作用域。

如果函数内的变量或函数已var方式声明的话,那么作用域仅仅限于该函数内,外部无法调用;如果函数内的变量或函数已this.方式声明的话,这就把该变量当做该函数的固有属性,可以从外部通过创造该函数的对象调用,也可以在外部对该函数进行添加属性。

我们也可以通过函数对象直接在外部对其添加属性函数(前提是外部函数被当做构造函数来执行);当外部函数被当做类来使用时,我们可以通过“类名.函数名”的方式直接添加函数。

三、闭包

1.闭包的定义:函数嵌套形成闭包

2.闭包的作用:可以改变变量作用域来实现属性使用分离

3. 闭包实现机制:一个函数里面定义另外一个函数,并返回当前函数


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值