python的话,我还真不好说为啥,我简单学过一点点的py语法,皮毛都够不上,这个游标卡尺直接把我劝退了
从js的角度来说说这个问题好了
============
js里头是没有模块这个概念的,任何一个定义在全局的函数,都能在任意位置引用
所以我们可以在函数内部定义一个函数,作为私有函数,模拟模块化
比如
function module() {
function f1(){
}
function f2(){
privateF1()
}
function privateF1(){
}
return {
f1,f2
}
}
那么你说的嵌套函数,其实应该是叫高阶函数
这东西可以存储数据,跟类一样
比如:
function person(name,age){
function hello(toSomebody){
console.log(`hello ${toSomebody}, i am ${name}`)
}
function getAge(){
return age
}
return {
hello,getAge
}
}
嵌套函数还可以作为回调
比如:
function ajax(param,callback){
function commonErrorHandle(){
}
return fetch(param).then(callback).catch(commonErrorHandle)
}
还可以把一部分有共同功能的函数都封装到一起,避免暴露到全局去
function doSth() {
function step1(){}
function step2(){}
function step3(){}
step1()
//...
}
也可以作为计算表达式用
function doExample(param) {
function calc(tags){
let tags = tags.split(',')
tags = tags.map(function(tag){
return tag+'标签'
})
tags = tags.filter(item => !!item)
return tags
}
let tags = calc(param.tags)
// ..
}
======
当然了,现在js仍处在一个学习的过程中,已经有了模块化,异步函数,正在有私有属性,还有想做的do表达式,惰性计算参数,甚至throw表达式等等
以上的几个写法,可能都不太推荐使用了
闭包的话,在js里头,MDN上说是指函数以及函数的context在内的一个集合;但是通用的说法是上面那句话里,被传递的函数,调用了函数外部的变量,导致这个变量在外层函数执行完毕之后内部的局部变量无法被释放
比如person那个用法:
正常执行完person之后,其参数的name和age理论上就可以释放了,但是由于内部传递出来的hello和getage两个方法分别引用了name和age,这会导致这两个参数不会被释放(如果主动放弃对返回值的引用,这两个参数还是会被释放的)
但是函数这个东西,威力远不止于此
python里头怎么用,可以自己探索
其实最基本的,函数就封装几个计算,根据参数返回不同的值,然后这个函数可以被传递,就这么简单