【问题标题】:Closure without nested function没有嵌套函数的闭包
【发布时间】:2017-03-04 20:21:28
【问题描述】:

到目前为止,我对闭包的理解是,如果一个函数返回一个函数,那么返回的函数(对象)会记住其(词法)父函数作用域的上下文,我在想一个可以实现闭包的场景没有实现嵌套函数。

下面的代码就是一个很好的例子。我在这里所做的是:

我使用了构造函数来创建对象,并且我使用了在内部定义的方法toString() 中传递给它的参数。

现在我创建了两个对象,并且两个对象都有各自的 id, name, madeInYear 副本。

请注意,我可以通过使用productId, productName, productOriginDate 获得相同的结果,但只是为了看到关闭,我编写了这样的代码 sn-p。

我观察到的另一件有趣的事情是我可以访问productId,但不能访问id。这是否意味着它们不是在 object 的上下文中创建的?

function f1(id,name,madeInYear)
{
this.productId=id;
this.productName=name;
this.productOriginDate=madeInYear;

this.toString=function()
{
    console.log("Function Parameters:"+id+" "+name+" "+madeInYear);
    console.log("Objects Method:"+this.productId+" "+this.productName+" "+this.productOriginDate);
}

}

var obj1=new f1(1,"Parker Pen","2001");
var obj2=new f1(2,"Jetter",2000);

obj1.toString();
obj2.toString();
obj1.productId;
obj2.productId;

输出

Function Parameters:1 Parker Pen 2001

Objects Method:1 Parker Pen 2001

Function Parameters:2 Jetter 2000

Objects Method:2 Jetter 2000

1

2

【问题讨论】:

  • 这在技术上不是一个闭包;这是constructor
  • 是什么让您认为您无法访问id?您的输出看起来工作正常。
  • 我可以访问 studentId 而不是 id。
  • applologies..its productid

标签: javascript closures


【解决方案1】:

闭包被定义为从定义函数的词法上下文访问局部变量,当该函数在该上下文之外调用时。

所以必须有一个函数来创建一个适当的闭包。您可以将外部函数替换为具有局部变量的其他函数,这在 ES6 中可以使用块作用域和 let 声明:

{
    let local = 3
    function f() {
        return local
    }
}
console.log(local) // undefined
console.log(f())   // 3

【讨论】:

  • 如果我创建五个对象会怎样。我们肯定会有 5 份 id,name,madeinYear。除了自己的 productid、productName、productMadeInYear 之外,每个对象都将保持 id、name、year 的引用。因此,如果 m 没有错误的闭包说记住上下文,这里每个对象都会记住上下文。请纠正我的错误
  • 如果你的构造函数改变了它的一个闭包变量的值,那么下次你调用构造函数时,它会看到修改后的值。不涉及复制。闭包定义函数的原始上下文。当您将值分配给对象自己的属性(this.id 等)并且您明确地执行此操作时,就会发生复制。
  • Touffy 我想我无法澄清我在说什么。
  • 可能是因为我用了copy这个词。我的意思是:当我创建 5 个对象时,构造函数将被调用 5 次。每次调用构造函数时都会创建 id,name,madeInYear,因此每个对象都将持有对这 3 个参数的引用。因此,每个对象都将引用它们各自的 id、name、madeInYear 以及它们自己的 producttId、productName、productOriginDate。因此,我们总共将有 6*5=30 个变量。
  • 这三个参数永远不会被破坏,因为我在 toString 方法中有对它们的引用,因此我正在实现关闭。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2014-11-15
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2023-04-08
相关资源
最近更新 更多