首页 > 解决方案 > 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

标签: javascriptfunction

解决方案


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);

因此,我们可以清楚地看到f1f2是不同的,因此返回的函数也不相同。只是为了清楚起见,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()被调用。


推荐阅读