到目前为止,我对闭包的理解是,如果一个函数返回一个函数,那么返回的函数(对象)会记住它(词法)父函数范围的上下文,我想到了一个可以实现闭包的场景没有实现嵌套函数。
以下代码就是一个很好的例子。我在这里做的是:
我使用了构造函数来创建对象,并且我已经在里面定义的方法toString()
中使用了传递给它的参数。
现在我创建了两个对象,两个对象都有id, name, madeInYear
的单独副本。
请注意我可以通过使用productId, productName, productOriginDate
获得相同的结果,但只是为了看封闭,我已经编写了这样的代码片段。
我观察到的另一个有趣的事情是我可以访问productId
但不能访问id
。这是否意味着它们不是在对象的上下文中创建的?
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
答案 0 :(得分:2)
闭包被定义为从定义函数的词汇上下文中访问局部变量,当在该上下文之外调用该函数时。
因此必须有一个函数来创建一个合适的闭包。您可以使用具有局部变量的其他内容替换外部函数,这在ES6中可以使用块作用域和let
声明:
{
let local = 3
function f() {
return local
}
}
console.log(local) // undefined
console.log(f()) // 3