首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clouse vs非闭包函数+ `this`?

Clouse vs非闭包函数+ `this`?
EN

Stack Overflow用户
提问于 2019-11-11 15:48:31
回答 1查看 29关注 0票数 0

我只是试着理解闭包和非clousure函数。因此,当我运行以下命令时...

代码语言:javascript
复制
function outer()
{
     var i = 0;
     i++;
     
     console.log( i );

}

outer(); // prints 1
outer(); // prints 1
outer(); // prints 1

但当我运行以下命令时...

代码语言:javascript
复制
function outer()
{
         var i = 0;

         function inner()
         {
                  i++;
                  console.log( i );
             }

         return inner;
}

var closure = outer();
closure(); // prints 1
closure(); // prints 2
closure(); // prints 3

这很好。我理解上面的内容。但是,当我尝试运行以下命令时...

代码语言:javascript
复制
function outer()
{
     var i = 0;
     i++;
     
     console.log( i );

}

var closure = outer();
closure(); // prints 1
closure(); // prints 2
closure(); // prints 3

我得到一个错误,因为与闭包不同,这里没有返回函数。因此,我将其修改为以下内容...

代码语言:javascript
复制
function outer()
{
     var i = 0;
     i++;
     
     console.log( i );

    return this;
}

var closure = outer();
closure(); // prints 1
closure(); // prints 2
closure(); // prints 3

我仍然收到一个错误,结果发现这个上下文中的this并没有引用父函数……相反,它指的是全局对象。难怪它会给出错误。但是,为了引用outer()函数,我可以用什么来替换this呢?

其次,即使到那时...我可以模拟闭包吗?我想不会..。但是为什么呢?

EN

回答 1

Stack Overflow用户

发布于 2019-11-11 15:59:38

这段代码var closure = outer()将执行外部函数,并将结果赋给closure。但是,由于没有从outer返回任何内容,closure()将不会像它期望的那样工作。在这种情况下,您可以尝试从外部删除()

同样,在这种情况下,返回this等同于不返回任何内容。在此函数中,this将还原为窗口对象,因此closure()将变为this()

代码语言:javascript
复制
function outer() {
  var i = 0;
  i++;
  console.log(i);
  return this;
}

var closure = outer;
console.log(closure());
closure();
closure();
代码语言:javascript
复制
I get an error because unlike in the closure,
the function is not being returned here. So,
I modified it to the following ...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58797373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档