JavaScript 闭包

Posted by xinxin on June 14, 2019

闭包实际上是能够读取函数内部的子函数才能读取其它函数内部的变量

闭包的用途 将变量始终保持在内存中

原理是返回一个函数并延后执行

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 1
f2(); // 4
f3(); // 9

python

def f(a):
    for i in range(5):
        a.append(lambda i:i*i)
    return a
aaa=f([])
print(aaa[0]())
print(aaa[1])
print(aaa[2])

#错误原因是变量i不存在

原因1

对比发现JavaScript存在立即执行语句(如果不存在这条语句(以下代码块)执行f1\f2\f3将出现同样的结果),

原因2

Python并不会将变量保留在内存中,延后执行

(function(x){return x*x;})(3);

与Python装饰器作对比Python的装饰器

实际上是传入一个函数返回一个函数的操作

@def
def now():
    print("2015-3-25")
now=log(now)#相当于执行了,log还要在定义

匿名函数不用显式的定义函数

Python匿名函数

lambda x:x*x
#相当于
def f(x):
    return x*x

javascprit匿名函数(箭头函数)

x=>x*x
//相当于
function (x){
    return x*x;
}


//包含多条语句
x=>{
    if(x>0){
        return x*x;
    }
    else{
        return -x*x;
    }
}

JavaScript中匿名函数this始终指向