没有嵌套函数的闭包

时间:2017-03-04 20:21:29

标签: javascript closures

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

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

我使用了构造函数来创建对象,并且我已经在里面定义的方法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

1 个答案:

答案 0 :(得分:2)

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

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

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