我对javascript有点新鲜,我只是尝试下面的片段:
_getUniqueID = (function () {
var i = 1;
return function () {
return i++;
};
}());
s = _getUniqueID();
console.log(s); // 1
console.log(_getUniqueID()); // 2
我的印象是我必须s()
才能获得1
作为结果,我认为_getUniqueID()
返回一个函数而不是执行其中的功能。有人可以解释一下这个功能的确切执行吗?
答案 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
()
时,它会调用该函数,
a-使函数将i识别为此函数的全局函数。
b-将功能分配给_getUniqueID
s = _getUniqueID();
,
a - 它在_getUniqueID
中为s指定函数的返回值,该值为1并使i为2 _getUniqueID()
时,它会再次调用返回函数
a-返回2作为值和
b使i的值为3。答案 2 :(得分:0)
这是Javascript中用于封装变量的模式。以下功能相当于:
var i = 1;
function increment() {
return i ++;
}
function getUniqueId() {
return increment();
}
但是为了避免使用3个名称(i
,increment
和getUniqueId
)来污染全局范围,您需要了解以下步骤来重构上述内容。首先发生的是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的工作原理。