2 回答
TA贡献1836条经验 获得超13个赞
我将为 python 解决它,因为这是我熟悉的。
首先,这种行为是唯一可能的,因为python(并且我认为看起来像javascript)遵循其闭包的后期绑定。进一步阅读
后期绑定是在运行时查找闭包中的名称(与在编译时查找名称的早期绑定不同。)
这允许在运行时通过重新绑定在运行时查找的变量(例如像 rec 之类的函数)来改变行为。
最后一步只是将 lambda 函数转换为等效的def语法,因此实际行为更加清晰。
编码:
rec = lambda x : 1 if x==0 else rec(x-1)*x
f = rec
rec = lambda x: x+1
print(f(10))
可以等价于:
第一的:
def somefunc(x):
return 1 if x==0 else rec(x-1)*x
请注意,即使在干净的会话/内核上,python 也不会抱怨 rec 不存在,因为它在函数定义期间不会查找值。后期绑定意味着除非调用这个函数,否则python不关心rec是什么。
然后:
rec = somefunc
f = rec
def someotherfunc(x):
return x + 1
f(10) #3628800
现在我们改变rec函数
rec = someotherfunc
并观察随后的函数调用f将使用后期绑定 rec,即在函数调用中查找。
f(10) #100
附注。完整代码添加如下:
def somefunc(x):
return 1 if x==0 else rec(x-1)*x
rec = somefunc
f = rec
def someotherfunc(x):
return x + 1
f(10) #3628800
rec = someotherfunc
f(10) #100
TA贡献1795条经验 获得超7个赞
你可以添加一些console.log和看法,首先f被调用10,然后rec用9其结果是10 * 10。
var rec = function(a) {
console.log('f', a);
if (a == 0) return 1;
return rec(a - 1) * a;
};
f = rec;
rec = function(a) {
console.log('rec', a);
return a + 1;
}
console.log(f(10));
保持rec.
var rec = function rec(a) {
console.log('f', a);
if (a == 0) return 1;
return rec(a - 1) * a;
};
f = rec;
rec = function(a) {
console.log('rec', a);
return a + 1;
}
console.log(f(10));
添加回答
举报