js函数作用域和块级作用域 如何才能通俗易懂的解释javascript里面的‘闭包’?

[更新]
·
·
分类:互联网
2217 阅读

js函数作用域和块级作用域

如何才能通俗易懂的解释javascript里面的‘闭包’?

如何才能通俗易懂的解释javascript里面的‘闭包’?

网上对闭包的解释都太专业了!我给个「非专业」的解释!有不对的地方,还望指正!
编程的本质是什么?是抽象 组合:
面向过程编程将业务抽象为数据结构 方法(过程),通过方法的组合来解决问题
面向对象编程将业务抽象为一个个的对象,通过对象间的组合通信来解决问题
函数式编程将业务抽象为一个个的函数,通过函数间的组合来解决问题
但是每种抽象方式都不是万能的。都是擅长某些方面,而不太擅长某些方面(否则就不会有越来越多的语言支持多种编程范式了。)而大部分的语言特性就是用来弥补自身不擅长的地方。比如闭包。
「闭包」的作用就是为了「实例化」函数!「实例化」的目的是为了保持状态!
我们来看一个OO的例子,我有一个类:
class Calc{ private int num public Calc(int num){
num } public int calc(int x) {
return x num }}通过这个类,我就能实例化出来多个不同状态的对象:
addOne new Calc(1)addTwo new Cacl(2)(1) // (2) // 3你可能会说,这在js里还不简单,定义个函数就可以了啊。
function add(a,b) { return a b}add(1,1)add(1,2)假设有1w个地方需要调用这个函数,你需要多写1w个1或2。后期如果要把1或2改成3的话,需要改1w个地方。上面的面向对象只需要在实例化的时候修改一下就可以了。
如果使用闭包呢?
function calc(num){ return function(a){ return a num}}addOne calc(1)addTwo calc(2)addOne(1) // 2addTwo(2) // 3是不是和上面的先定义了类,再实例化是一样的了?如果需要调整1或者2为3,只需要在构建闭包的时候调整一下就可以了。
最后再解释一下,为什么叫闭包呢?看上面的匿名函数!这个函数需要一个外部的变量num。当传递了num给它之后,它就不再需要直接访问外部的值了(只通过传入参数的方式获取值)。换种说法就是它对外关闭了!所以称为「闭包」!

js定义全局变量要不要加var?

1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量。使用var定义var a hello Worldfunction bb(){ var a hello Bill console.log(a) }bb() // hello Billconsole.log(a) // hello world不使用var定义var e hello worldfunction cc(){ e hello Bill console.log(e) // hello Bill}cc() // hello Billconsole.log(e) // hello Bill2.在全局作用域下,使用var定义的变量不可以delete,没有var 定义的变量可以delete.也就说明隐含全局变量严格来说不是真正的变量,而是全局对象的属性,因为属性可以通过delete删除,而变量不可以。3.使用var 定义变量还会提升变量声明,即使用var定义:function hh(){ console.log(a) var a hello world}hh() //undefined不使用var定义:function hh(){ console.log(a) a hello world}hh() // a is not defined这就是使用var定义的变量的声明提前。4.在ES5的use strict模式下,如果变量没有使用var定义,就会报错。