简单函数

时间:2015-08-09 21:51:40

标签: javascript

我对javascript有点新鲜,我只是尝试下面的片段:

_getUniqueID = (function () {

        var i = 1;
        return function () {
            return i++;
        };

    }());


s = _getUniqueID();
console.log(s); // 1
console.log(_getUniqueID()); // 2

我的印象是我必须s()才能获得1作为结果,我认为_getUniqueID()返回一个函数而不是执行其中的功能。有人可以解释一下这个功能的确切执行吗?

4 个答案:

答案 0 :(得分:2)

您在这里看到的是Javascript关于闭包的概念与立即调用的函数表达式的模式相结合。

我会尝试尽可能简短地说明发生的事情:

_getUniqueID = (function () {

    var i = 1;
    return function () {
        return i++;
    };

}()); <-- The () after the closing } invokes this function immediately.

_getUniqueID被赋予此立即调用的函数表达式的返回值。从IIFE返回的是一个带有包含变量i的闭包的函数。我变成类似于函数所拥有的私有字段,只要它被调用就返回i ++。

s = _getUniqueID();

此处调用返回的函数(具有正文return i++;的函数),并为s指定返回值1。

希望有所帮助。如果您是Javascript的新手,您应该阅读“Javascript,Good Parts”这本书。它将更详细地解释所有这些。

答案 1 :(得分:0)

_getUniqueID = (function () {

        var i = 1;
        return function () {
            return i++;
        };

    }());


s = _getUniqueID();
console.log(s); // 1
console.log(_getUniqueID()); // 1
  1. 当你执行()时,它会调用该函数, a-使函数将i识别为此函数的全局函数。 b-将功能分配给_getUniqueID
  2. 你做s = _getUniqueID();, a - 它在_getUniqueID中为s指定函数的返回值,该值为1并使i为2
  3. 再次执行_getUniqueID()时,它会再次调用返回函数 a-返回2作为值和 b使i的值为3。

答案 2 :(得分:0)

这是Javascript中用于封装变量的模式。以下功能相当于:

var i = 1;
function increment() {
    return i ++;
}

function getUniqueId() {
    return increment();
}

但是为了避免使用3个名称(iincrementgetUniqueId)来污染全局范围,您需要了解以下步骤来重构上述内容。首先发生的是increment()函数是在本地声明的,因此它可以使用getUniqueId()函数的本地范围:

function getUniqueId() {
     var i = 0;
     var increment = function() {
          return i ++;
     };
     return increment();
}

现在增量函数可以匿名化:

function getUniqueId() {
     var i = 0;
     return function() {
          return i ++;
     }();
}

现在外部函数声明被重写为局部变量声明,这再次避免了污染全局范围:

var getUniqueId = function() {
     var i = 0;
     return (function() {
          return i ++;
     })();
}

您需要使用括号使函数声明充当调用运算符(()可以操作的内联表达式。

由于内部和外部函数的执行顺序现在不再有所不同(即获取内部生成器函数并调用它,或生成数字并返回它),您可以将上面的内容重写为

var getUniqueId = (function() {
     var i = 0;
     return function() {
          return i ++;
     };
})();

该模式或多或少是在Crockford's private pattern

之后建模的

答案 3 :(得分:-2)

_getUniqueID = (function () {

        var i = 1;
        return function () {
            return i++;
        };

    }());

console.log(_getUniqueID()); // 1 , this surprised me initially , I was expecting a function definition to be printed or rather _getUniqueID()() to be called in this fashion for 1 to be printed

所以上面的代码片段让我感到困惑,因为我不理解上面的脚本是按照以下方式工作的,到IFFE执行时_getUniqueID基本上就是以下内容:

_getUniqueID = function () {
           i = 1 
           return i++;
};

因此,

_getUniqueID() // prints 1.

打印1.

注意:请注意我了解闭包和IFFE的工作原理。