javascript - Javascript函数返回函数
问题描述
学习javascript,对下面的代码有几个问题
const o = {
f (v){
function c(p){
console.log(p)
}
return c
}
}
f1 = o.f()
f2 = o.f()
问题
1) 确实f1 and f2
有所不同clones of c(p)
就像f1 and f2
每个指向唯一的内存空间一样,c(p)
复制代码的地方
2)或确实f1 and f2
指向相同的内存空间c(p)
3)上面的代码也是关闭的场景吗?
whereo.f
有一个闭包c(p)
,即使在o.f
执行堆栈消失后,我们也有一个引用c(p)
形式f1 and f2
解决方案
1) f1 和 f2 是否得到不同的 c(p) 克隆
那是对的。每次调用o.f()
都会创建一个全新的function c(p)
. 这也很容易显示,我将稍微修改您的代码:
const o = {
f (v){
function c(p){
console.log(p)
}
return c
}
}
f1 = o.f()
f2 = o.f()
console.log(f1 === f2);
因此,我们可以清楚地看到f1
和f2
是不同的,因此返回的函数也不相同。只是为了清楚起见,JavaScript 中的对象只有在它们是同一个对象时才相等,而不仅仅是形状和内容相似。函数也是对象,因此:
const a = function f() {
return 2 + 2;
};
const b = function f() {
return 2 + 2;
};
const c = a;
console.log("a === b", a === b); //false
console.log("b === c", b === c); //false
console.log("a === c", a === c); //true
2) 还是 f1 和 f2 指向与 c(p) 相同的内存空间
好吧,绝对没有。我已经在上面展示了 - 功能不同。
3)上面的代码也是关闭的场景吗?
嗯,是的,但是……这真的没关系。每次创建函数时都会创建一个闭包。因此,它o.f()
自己有一个,然后每次创建c()
一个都会o.f()
被调用。
推荐阅读
- .htaccess - 强制客户端的浏览器丢弃 PWA 工作缓存
- prometheus-alertmanager - alertmanager 按标签过滤(时间刻度后端)
- php - 如果重复,自动将用户名设置为“first_name-last_name”,并带有增量编号
- python - 时间序列:.idxmax() 返回第一个数据时间而不是最后一个数据时间
- google-sheets - 查找线性趋势作为单个数字谷歌表
- docker - Docker Compose V2 重大更改 - 环境文件处理问题
- ios - 我的 iOS 应用程序如何查看群组消息中的联系人?
- javascript - React Native IOS-Typedef 重新定义不同类型('uint8_t'(又名'unsigned char')与'enum clockid_t')
- python - 为什么我使用断言时没有任何输出显示?
- flutter - 如何在flutter中单击切换按钮时更改多个listtile颜色