Open xxleyi opened 5 years ago
changA 传参
let a = {a: 3}
function changeA(a){
a = {a: "change"}
}
changeA(a)
a = {'a': 3}
def changeA(a):
a = {'a': "change"}
changeA(a)
Closure:
Environment Diagrams: visual tool to keep track of bindings and state of a computer program.
Python assumes that all variables in a function are local.
In Python local variable declaration is automatic/implicit while in JavaScript it is not (you have to use var or let or const).
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
var funcs = [];
function createfunc(i) {
return function() { console.log("My value: " + i); };
}
for (var i = 0; i < 3; i++) {
funcs[i] = createfunc(i);
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
function f() {
var result = [];
for (var i of [0, 1, 2]) {
result.push(function () { return i });
}
return result;
}
var result = f();
console.log(result[0](), result[1](), result[2]());
var result = []
function f() {
let y = result.length;
result.push(function () { return y });
}
f();
f();
f();
console.log(result[0](), result[1](), result[2]());
# funcs = [];
# for i in range(3):
# funcs.append(lambda: print("Myvalue: " + str(i)))
# for j in range(3):
# funcs[j]()
funcs = [];
def createfunc(i):
return lambda: print("Myvalue: " + str(i))
for i in range(3):
funcs.append(createfunc(i))
for j in range(3):
funcs[j]()
def outer():
result = []
for i in range(3):
def inner():
return i
result.append(inner)
return result
result = outer()
print(result[0].__closure__)
print(result[1].__closure__)
print(result[2].__closure__)
print(result[0](), result[1](), result[2]())
# 另外一种形式
result = []
def outer():
y = len(result)
def inner():
return y
result.append(inner)
outer()
outer()
outer()
print(result[0].__closure__)
print(result[1].__closure__)
print(result[2].__closure__)
print(result[0](), result[1](), result[2]())
环境模型干的事情:状态管理。 其数据结构不算复杂,就是一层层的 frame,每一层 frame 维护自己内部的映射关系,同时又有一个专门的link,指向自己所归属的 frame。
JS 和 Python 共通大概有:
JS 特有:
Python 特有(可能):
词法作用域:
强烈推荐一篇文章(文章成篇较早,没涉及 let const 语法,但丝毫不影响这些概念):Variables: Scopes, Environments, and Closures
let curriedAdd = a => b => a + b
let eleven = curriedAdd(5)(6)
console.log(eleven === 11)
// 进阶版
let curred2 = h => a => b => h(a, b)
let curriedAdd = curred2((a, b) => a + b)
let addFive = curriedAdd(5)
let eleven = addFive(6)
console.log(eleven === 11)
JS Tutor curry2 演示 推荐文章:Currying in JavaScript ES6
def curry2(h):
def f(x):
def g(y):
return h(x, y)
return g
return f
make_adder = curry2(lambda x, y: x + y)
add_three = make_adder(3)
add_four = make_adder(4)
five = add_three(2)
# lambda expression
curry2 = lambda h: lambda x: lambda y: h(x, y)
make_adder = curry2(lambda x, y: x + y)
add_three = make_adder(3)
add_four = make_adder(4)
five = add_three(2)
def outer():
x = 100
def inner():
print(x)
print(inner.__closure__) # not None
inner()
outer()
现在回头来看,价值依旧。
序
大部分人对闭包的掌握程度:
定场鸡汤
changA 不传参
JS Tutor 小演示
Python3 Tutor 小演示