我正在尝试在用户单击HTML表格中的单元格时注册匿名函数.这是一些原始的,纯粹的代码:
document.getElementById(
"course"+displayed_year_index+occurrences_indices[displayed_year_index]).onclick =
eval("function() {PrintReceipt("+result.years[result_year_index].rul_code+");};");
Run Code Online (Sandbox Code Playgroud)
注意使用eval,因为它位于一个循环中,并且匿名函数每次都是不同的.
可以说,这在Firefox 2中运行得非常好.但是,Firefox 3会抛出"语法错误",指向"函数"一词后的括号内.
有没有人对如何解决这个问题有任何明智的想法?
为了清楚地说明我正在尝试做什么,这里有一个简单的例子:
for (index=0; index<4; index++) {
document.getElementById("div"+index).onclick =
eval("function () {Foo(index);};");
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望触发相同的功能,每个参数值都有不同的参数值div.
javascript firefox closures anonymous-function event-handling
我使用这样的代码将参数传递给事件处理函数.但是,在这种特殊情况下,循环会导致问题.在所有activeVisual调用中只能访问最后一个linkTags [i].这与传递参数的匿名函数对于整个循环是一个相同的事实有关.
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Run Code Online (Sandbox Code Playgroud)
现在,我记得在匿名函数声明之前尝试添加new,如下所示:
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
new function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Run Code Online (Sandbox Code Playgroud)
那没起效.activeVisual永远不会被调用.有人可以向我解释为什么以及如何让它成功呢?
更新最终解决方案
感谢下面的所有回复,我的工作代码现在看起来像这样:
// Function that provides pass of event handling parameters with separate copy in each loop
function callbackHandler(index) {
return function(evt) {
activeVisual(evt, linkTags[index]);
}
}
...
for (var i = 0; …Run Code Online (Sandbox Code Playgroud) 我想在我的jQuery函数中调用editObject(),初始化调用确实有效,但是setTimeout不起作用,如何让它运行?控制台说setTimeout调用时没有定义editObject:
(function($){
$.fn.extend({
...
editObject()
function editObject() {
alert("Test!");
setTimeout('editObject()', 1000);
}
return this.each(function() {
var o = options;
});
}
});
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
感谢帮助!
可能重复:
javascript:递归匿名函数?
匿名递归PHP函数
我在想......是否可以使用匿名函数进行递归?
这是一个例子:我需要得到六个字符长的字符串,它可能只包含数字和空格.唯一的规则是它不能以空格开头或结尾.我们检查一下,如果发生这种情况 - 只需在相同的匿名函数上调用递归.怎么样!?
function() {
$chars = range(0, 9);
$chars[] = ' ';
length = 6;
$count = count($chars);
$string = '';
for ($i = 0; $i < $length; ++$i) {
$string .= $chars[mt_rand(0, $count - 1)];
}
$string = trim($string);
if (strlen($string) !== $length) { // There were spaces in front or end of the string. Shit!
// Do recursion.
}
return $string;
}
Run Code Online (Sandbox Code Playgroud) php recursion reference anonymous-function anonymous-recursion
我有以下代码:
function checkPermission(user) {
var result = 'default';
$.get('/mymodule/checkPermission.php?user=' + user, function(data) {
result = data; // does not store data into result, why ?
if (result == 'no') {
$('.sorry_msg').show();
}
});
alert(result); // shows "default".
return result == 'yes';
}
Run Code Online (Sandbox Code Playgroud)
你能解释为什么这不起作用.问题是我无法存储data变量result,请参阅代码中的注释.我想这是因为匿名函数,但我不知道javascript到底能够准确理解会发生什么.
另外,如何可以返回true或false在checkPermission基于Ajax调用的结果函数?
我想知道是否可以在Perl的子例程中声明一个全局变量,这样我就可以在钩子化的void函数中使用该变量,但是通过在子例程中声明它来限制全局的破坏性影响.
因此子例程用于XML::Parser收集一堆元素的ID,方式类似于:
sub getRecipeIDs {
my $recipe = shift;
my @elements = ();
my $parser = new XML::Parser(Style => 'Tree',
Handlers => {
Start => sub {
my ($expat, $element, %attrs) = @_;
if ($element eq 'recipe') {
push @elements, $attrs{id};
}
}});
$parser->parse($recipe);
return @elements;
}
Run Code Online (Sandbox Code Playgroud)
我也在strict我的剧本中使用.
所以我想以@elements这样的方式声明它是本地的,getRecipeIDs但是对于匿名子例程是可见的.
感谢您的时间,非常感谢任何帮助.
在使用Laravel框架时,更具体的 - 表单宏,我偶然发现了一个奇怪的错误.
起初,我认为Laravel有点不对劲,但后来我把所有东西都脱离了背景:
<?php
// placeholder function that takes variable as reference
$function = function(&$reference)
{
// append to variable
$reference = $reference . ':' . __METHOD__;
};
// test with straight call
$variable = 'something';
$function($variable);
echo $variable;
// test with call_user_func(), that gets called in Laravels case
$variable = 'something'; // reset
call_user_func($function, $variable);
echo $variable;
Run Code Online (Sandbox Code Playgroud)
第一次$function正确执行调用时,第二次尝试使用call_user_func(),生成(摘自Codepad):
Warning: Parameter 1 to {closure}() expected to be a reference, value given
PHP Warning: Parameter 1 …Run Code Online (Sandbox Code Playgroud) 我创建了这个简单的匿名函数
var b = (x : Int) => if(x % 2 == 0) x + 1 else x
Run Code Online (Sandbox Code Playgroud)
它很棒.之后,我尝试在if和x+1语句之前添加另一个语句.
var b = (x : Int) => if(x % 2 == 0) println(x) x + 1 else x
Run Code Online (Sandbox Code Playgroud)
并且在那一点上我收到了以下编译器错误
无法解析符号x
请任何人都可以告诉我为什么会这样吗?
我想使用下面的Erlang代码来获取整数列表中的最高整数,但由于某种原因,总会最终获得列表中的最后一个整数。有什么帮助吗?
解决方案示例-> test:max([2,8,5,6]).应该返回8,但使用此代码将返回6。
-spec max(L) -> M when
L::[integer()],
M::integer().
max([H | T]) ->
F = fun(L, Acc) -> max([L]) end,
lists:foldl(F, H, T).
Run Code Online (Sandbox Code Playgroud) 所以我正在阅读这本书,并在某些时候指出:
还有第二种形式的&function capture操作符.您可以为其指定现有函数的名称和arity(参数数量),它将返回一个调用它的匿名函数.
但我不明白为什么有人想要这样做.如果您愿意,可以将命名和未命名函数绑定到变量,从中可以获得什么好处.