无法理解Javascript嵌套函数/闭包

时间:2014-12-02 07:05:01

标签: javascript

我正在尝试将以下JavaScript代码移植到ruby: https://github.com/iguigova/snippets_js/blob/master/pokerIn4Hours/pokerIn4Hours.js

我把它的大部分都排序了,给我带来悲伤的功能是:

var kickers = function(idx){ // http://en.wikipedia.org/wiki/Kicker_(poker)        
    idx = idx || -15; 
    var notplayed = Math.max(input.length - 1/*player input*/ - 5, 0);
    return function(all, cardinality, rank) {
        return (all || 0) + (((cardinality == 1) && (notplayed-- <= 0)) ? rank * Math.pow(10, ++idx) : 0);
    };
}();

它被称为进一步向下:

k = kickers(k, cardsofrank[i], i);

我想知道是否有人可以用JavaScript解释这是如何工作的。内部函数有3个参数而外部函数只有1个这一事实令人困惑,特别是考虑到它是用3个参数调用的。我想了解它正在尝试完成的任务,以便我可以放心地移植代码。

2 个答案:

答案 0 :(得分:1)

function(idx)此函数返回一个新函数function(all, cardinality, rank),这个新函数依次由kickers变量引用。因此,踢球者基本上指向你返回的内部功能。

调用返回函数的唯一方法是kickers(k, cardsofrank[i], i)

答案 1 :(得分:0)

var kickers = function(idx){
    var xyz;//below function in return statement can access this and argument idx
    return function(...) {//this ensures that your kickers is infact a function
    };
}();//invoke this function instantly due to () and assign the output to kickers

当Javascript解释器读取上面对Kickers的赋值时,它将执行匿名函数 由于该函数本身返回一个函数,kickers现在将成为一个函数(带闭包)。 这意味着kickers函数将引用环境变量(idx和notplayed)

修改
1)获取idx的值 - 由于在调用函数时没有传递任何内容(最后一行();),idx将被取消定义,idx = idx || -15;将赋值 - 15到它。

2)这可以在没有内部功能的情况下重写吗? - 是的。但是当前的实现具有以下优势:idxnotplayed的范围仅限于kicker函数,并且无法在全局访问。以下是如何将其直接写为函数

/* now  idx and notplayed is global- but its meant to be used only by kicker
 * we cant move it inside the function definition as it will behave as local variable to the function 
 * and hence will be freed up once executed and you cannot maintain the state of idx and notplayed
*/
var idx = -15;
var notplayed = Math.max(input.length - 1/*player input*/ - 5, 0);
var kickers = function(all, cardinality, rank) {            
    return(all || 0) + (((cardinality == 1) && (notplayed-- <= 0)) ? rank * Math.pow(10, ++idx) : 0);
}