我想做以下事情:
for (var i = 0; i < 10; ++i) {
createButton(x, y, function() { alert("button " + i + " pressed"); }
}
Run Code Online (Sandbox Code Playgroud)
这个问题是我总是得到最终值,i因为Javascript的闭包不是按值.
那么我怎么能用javascript做到这一点?
所以在数据库字段中有一个php函数.这是它的样子:
'$put_fname_fn = function($filename) {
return $filename.'.Z';
};'
Run Code Online (Sandbox Code Playgroud)
我正在执行它:
$code = fetchFromDatabase(); // Get the function string
eval($code);
$put_fname_fn('MYFILE.TXT'); // Convert it to MYFILE.TXT.Z
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式来调用用户功能?我尽量避免使用eval,但我没有其他方法来做到这一点.
可能重复:
立即执行匿名函数
我想立即评估一个匿名函数,而不是它在方法args中作为Closure对象出现.这可能吗?
例如:
$obj = MyClass;
$obj->Foo(function(){return "bar";}); // passes a Closure into Foo()
$obj->Foo(function(){return "bar";}()); // passes the string "bar" into Foo()?
Run Code Online (Sandbox Code Playgroud)
第3行是非法语法 - 有没有办法做到这一点?
谢谢
我以前从未在PHP中使用过匿名函数,但是我发现了一段代码,它使用一个代码来排序对象
usort($numTurnsPerUser,build_sorter('turns'));
function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
Run Code Online (Sandbox Code Playgroud)
此代码将通过键对对象进行排序(我传入"turn").例如,一个看起来像这样的对象:(用JSON编写,只是为了便于阅读)
$numTurnsPerUser = {
"31":{
"turns":15,
"order":0
}, "36":{
"turns":12,
"order":1
}, "37":{
"turns":14,
"order":2
}
}
Run Code Online (Sandbox Code Playgroud)
将被分类为如下所示的对象:
$numTurnsPerUser = {
"36":{
"turns":12,
"order":1
}, "37":{
"turns":14,
"order":2
}, "31":{
"turns":15,
"order":0
}
}
Run Code Online (Sandbox Code Playgroud)
这在我的运行PHP 5.3.0的本地服务器上运行良好,但它无法在我的在线服务器上运行,运行"php5" - 我无法找到除此之外的任何信息.我收到了一个错误
解析错误:语法错误,意外T_FUNCTION
我读到PHP <5.3不能使用匿名函数,必须使用create_function,但匿名函数的"use"部分让我难以理解.有人可以向我解释一下该功能的"使用"部分是什么,或者更好的是,我如何将其"翻译"到所需的create_function参数?
我有两个列表:L和E.我尝试编写一个函数,它返回另一个列表,其中包含L中元素的出现次数.
-module(mymodule).
-export([count/2]).
-export([numberOfOccurences/2]).
count([Head|Tail], Counter) ->
fun(Element) -> if
[Head|Tail] == [] -> Counter;
Element == Head -> count(Tail, Counter + 1);
Element /= Head -> count(Tail, Counter)
end
end.
numberOfOccurences(L, E) ->
lists:map(count(L, 0), E).
Run Code Online (Sandbox Code Playgroud)
mymodule:numberOfOccurences[1,2,"abc",2,1,"abc",4,1,1], [1,2,3,"abc"])应该回来[4,2,0,2].但它返回一个包含4个函数的列表.我究竟做错了什么?
erlang closures functional-programming list anonymous-function
我是定点组合器世界的新手,我猜他们已经习惯了匿名的lambdas,但我还没有真正使用它们,甚至无法完全绕过它们.
我在Javascript中看到了Y-combinator的例子,但是还没能成功运行它.
这里的问题是,有人可以给出一个直观的答案:
奖励积分:如果示例不仅仅是一种语言,最好也是在Clojure中.
更新:
我已经能够在Clojure中找到一个简单的例子,但仍然发现很难理解Y-Combinator本身:
(defn Y [r]
((fn [f] (f f))
(fn [f]
(r (fn [x] ((f f) x))))))
Run Code Online (Sandbox Code Playgroud)
虽然这个例子很简洁,但我发现很难理解函数中发生了什么.提供的任何帮助都是有用的.
functional-programming y-combinator anonymous-function higher-order-functions fixpoint-combinators
我注意到在Julia中使用匿名函数会导致性能下降.为了说明我有两个quicksort实现(取自Julia发行版中的微观性能基准).第一种按升序排序
function qsort!(a,lo,hi)
i, j = lo, hi
while i < hi
pivot = a[(lo+hi)>>>1]
while i <= j
while a[i] < pivot; i += 1; end
while pivot < a[j]; j -= 1; end
if i <= j
a[i], a[j] = a[j], a[i]
i, j = i+1, j-1
end
end
if lo < j; qsort!(a,lo,j); end
lo, j = i, hi
end
return a
end
Run Code Online (Sandbox Code Playgroud)
第二个需要一个额外的参数:一个匿名函数,可用于指定升序或降序排序,或比较更奇特的类型
function qsort_generic!(a,lo,hi,op=(x,y)->x<y)
i, j = lo, hi
while i < hi
pivot = …Run Code Online (Sandbox Code Playgroud) 如果我有下面的代码,我将两个函数作为参数传递给 function sayHi,这是回调的示例吗?
我注意到有两种运行这些“参数函数”的方法:要么如下所示,我们在定义它们的地方调用函数(作为参数),要么在 sayHi 函数中调用参数。这是回调函数和匿名函数之间的区别吗?
function sayHi(name, testForTrue) {
if (testForTrue == true) {
console.log(name);
}
}
sayHi(function() {
return 'Zach'
}(), function() {
return true;
}());
Run Code Online (Sandbox Code Playgroud)
我可以获得相同结果的另一种方法如下。在这种情况下,我在不同的时间评估函数?两者之间有什么实际区别吗?
function sayHi(name, testForTrue) {
if (testForTrue() == true) {
console.log(name());
}
}
sayHi(function() {
return 'Zach'
}, function() {
return true;
});
Run Code Online (Sandbox Code Playgroud) PHP 5.3+ 支持匿名函数(尽管在 PHP 7.x+ 中,它对匿名函数的支持在绑定方面略有不同)。我正在运行 PHP 5.6.x
是否有一种语法允许将多个参数传递给用作回调的匿名函数(而不是仅使用数组)。以下哪些示例(如果有)可以在 PHP 中实现?
实施例1
function ($str1, $str2 ){ //But, that would be too easy, right?
return $str1 . $str2;
}
Run Code Online (Sandbox Code Playgroud)
实施例2
function () use ($string, $min, $max) { // Not seeing this in the manual.
$length = mb_strlen($string, 'UTF-8');
return ($length >= $min) && ($length <= $max);
}
Run Code Online (Sandbox Code Playgroud)
实施例3
只是出于好奇,这种形式可能吗?
function ($str1, $str2 ) use ($int1, $int2) { // But, that would be in the …Run Code Online (Sandbox Code Playgroud) 假设我有一个名为 trig 的函数,它返回两个输出:
function trig(x)
return(sin(x), cos(x))
end
Run Code Online (Sandbox Code Playgroud)
如果我想评估多个值的三角函数,我可以使用 map 函数:
julia> out = map(trig, (0:(pi/12):(pi/2)))
Run Code Online (Sandbox Code Playgroud)
out 是一个 7 元素数组,每个元素中都有一个包含两个元素的元组:
julia> out
7-element Array{Tuple{Float64,Float64},1}:
(0.0,1.0)
(0.258819,0.965926)
(0.5,0.866025)
(0.707107,0.707107)
(0.866025,0.5)
(0.965926,0.258819)
(1.0,6.12323e-17)
Run Code Online (Sandbox Code Playgroud)
我的问题是:解开正弦和余弦的最佳方法是什么,以便我有两个数组,每个数组有 7 个元素?是否可以在不创建多余的元组数组的情况下广播三角函数,而是直接创建我真正感兴趣的两个数组?
目前,我再次调用 map 以便从 out 中提取值以填充我想要的数组,但我认为这不是执行此操作的最佳方法:
sines = map(x->x[1], out)
cosines = map(x->x[2], out)
Run Code Online (Sandbox Code Playgroud)
出于本问题的目的,假设 trig 是一个计算量大的函数。因此,请不要给我一个需要多次评估 trig 的答案。
php ×4
callback ×2
closures ×2
javascript ×2
julia ×2
arrays ×1
erlang ×1
eval ×1
function ×1
lambda ×1
list ×1
performance ×1
sorting ×1
y-combinator ×1