我正在尝试将以下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个参数调用的。我想了解它正在尝试完成的任务,以便我可以放心地移植代码。
答案 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)这可以在没有内部功能的情况下重写吗? - 是的。但是当前的实现具有以下优势:idx
和notplayed
的范围仅限于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);
}