在JavaScript中关闭我的工作方式不同

时间:2016-05-06 03:41:23

标签: javascript closures

考虑以下代码段

function outer(data1){
    function inner(){
        console.log(data1);
    }
    return inner;
}

在以下两个函数调用中,第一个有效但第二个无效。

var o = outer("sree");
o();  //works
outer("kumar");  //does not work

请帮助我更好地理解。感谢。

4 个答案:

答案 0 :(得分:4)

这样打电话:

outer("kumar")(); 

outer("kumar");调用它只会得到内部函数的引用。通过再次放置大括号,它也将调用内部函数。

答案 1 :(得分:1)

你的内部功能没有参数,你需要添加如下:

   function outer(){
        function inner(data1){
            console.log(data1);
        }
        return inner;
    }

您的代码将始终在控制台中登录您创建对象的参数。

答案 2 :(得分:1)

当你调用函数outer("kumar")时,函数返回一个函数,但是没有调用该函数,这就是为什么这个调用没有登录到控制台的原因。

另一方面,如果你创建一个调用函数var o = outer("sree");的新变量,正如我所提到的,函数 outer 返回一个函数 inner ,然后您使用创建的新变量o();调用该函数。

答案 3 :(得分:0)

 function outer(data1){
    return (function inner(){
       return data1; 
        });
 }

函数outer返回另一个函数'inner',这是一种引用,并且执行一个我们需要调用的函数,就像我们调用外函一样。

var o = outer(“sree”);

的console.log(○()); 变量o包含对函数inner的ref。要执行它,我们需要调用(o())。 在你的最后一个动作(console.log(外部(“kumar”)))中,你已经调用了第一个函数,它导致ref为'inner'函数,以获得你必须调用第二个函数的输出。 kumar将被打印,因为'inner'方法在外部函数的范围内。