我一直在尝试为JavaScript中的动态创建的"a"标记的onclick事件分配一个函数.所有标记都在循环中创建,如下所示:
for ( var i = 0; i < 4; i++ )
{
var a = document.createElement( "a" );
a.onclick = function( ) { alert( i ) };
document.getElementById( "foo" ).appendChild( a );
}
Run Code Online (Sandbox Code Playgroud)
所有四个链接的警报值始终为"4".很明显.谷歌搜索时,我遇到了一个显示以下代码片段的帖子:
a.onclick = (function(p, d) {
return function(){ show_photo(p, d) }
})(path, description);
Run Code Online (Sandbox Code Playgroud)
我设法根据我的需要调整它并获得警报(i)正常工作的事情,但如果有人能够准确解释上述代码的作用,我将不胜感激.
javascript closures loops anonymous-function javascript-events
我感兴趣的是,如果可以使用C#编写类似于这个Javascript的代码:
var v = (function()
{
return "some value";
})()
Run Code Online (Sandbox Code Playgroud)
我能做的最多是:
Func<string> vf = () =>
{
return "some value";
};
var v = vf();
Run Code Online (Sandbox Code Playgroud)
但是我想要这样的东西:
// Gives error CS0149: Method name expected
var v = (() =>
{
return "some value";
})();
Run Code Online (Sandbox Code Playgroud)
有没有办法调用函数让它匿名?
只是出于兴趣,它们之间是否有任何速度/功能差异
function foo(bar) {
alert("foo" + bar);
}
Run Code Online (Sandbox Code Playgroud)
和
var foo = function(bar) {
alert("foo" + bar);
};
Run Code Online (Sandbox Code Playgroud) Clojure如何确定匿名函数(使用#...符号创建)期望的参数数量?
user=> (#(identity [2]) 14)
java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$eval3745$fn (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud) 如何?
举个简单的例子.我有一个简单的功能:
DO LANGUAGE plpgsql $$ DECLARE
BEGIN
EXECUTE 'SELECT NOW()';
END $$;
Run Code Online (Sandbox Code Playgroud)
我如何从匿名函数返回"NOW()"或其他值的值?该函数作为一个例子我有一个更复杂的功能.
我越深入研究javascript,就越会考虑某些设计决策和鼓励实践的后果.在这种情况下,我正在观察匿名函数,这个函数不仅是JavaScript提供的,而且我看到强烈使用.
我想大家都同意以下事实:
虽然匿名函数似乎是一个非常好的功能,但它的使用导致深度嵌套的代码设计.代码编写速度快,但难以阅读.它不是被迫为一个功能发明一个命名的上下文,而是压缩你的可调用对象的层次结构,而是鼓励"深入一层",推动你的大脑堆叠,并迅速溢出7 +/- 2规则.艾伦·库珀(Alan Cooper)的" 关于面子 "(About Face)表达了类似的概念,引用了"人们不了解等级制度".作为程序员,我们确实理解了层次结构,但是我们的生物学仍然限制了我们对深层嵌套的掌握.
我想在这一点上听到你的意见.如果匿名功能被认为是有害的,我们后来发现的一种明显闪亮的语法糖是盐,甚至是鼠毒?
CW因为没有正确答案.
我有一个"调度图"定义如下:
private Dictionary<string, Func<DynamicEntity, DynamicEntity, IEnumerable<DynamicEntity>, string>> _messageProcessing;
Run Code Online (Sandbox Code Playgroud)
这允许我根据DynamicEntity实例的名称轻松地分派到不同的方法.
为了避免被更多地维护代码的每个人所厌恶,有没有办法在Func中命名参数以给出哪些DynamicEntity是哪个?
如何在不使用尾递归的情况下在匿名函数中进行递归?
例如(来自Vanderhart 2010,第38页):
(defn power
[number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))
Run Code Online (Sandbox Code Playgroud)
假设我想将其作为匿名函数执行此操作.由于某种原因,我不想使用尾递归.我该怎么办?例如:
( (fn [number exponent] ......))))) 5 3)
125
Run Code Online (Sandbox Code Playgroud)
我可以使用循环这一点,也可以仅环搭配使用易复发?
lisp functional-programming tail-recursion clojure anonymous-function
在JavaScript中,看到自调用函数并不罕见:
var i = (function(x) {
return x;
})(42);
// i == 42
Run Code Online (Sandbox Code Playgroud)
虽然我当然没有比较这些语言,但我认为这样的构造可以翻译成C#,只要提供支持的语言版本:
var i = (delegate(int x) {
return x;
})(42);
Run Code Online (Sandbox Code Playgroud)
要么:
var i = ((x) => {
return x;
})(42);
Run Code Online (Sandbox Code Playgroud)
甚至:
var i = (x => x)(42);
Run Code Online (Sandbox Code Playgroud)
但是,每个版本都有错误:
预期的方法名称
自调用匿名方法是否不受支持(由于显式禁止或类型推断不可能),或者我的尝试中是否存在错误?
我冒昧地猜测,因为没有方法声明(Func<T,T>)可以推断出类型,它无法理清隐含的类型,我打算通过名称调用声明的方法,并且真正搞砸了语法.
勘误表
在此问题充斥之前:
var i = new Func<int, int>(x => x)(42);
Run Code Online (Sandbox Code Playgroud)
我应该说我希望利用类型推断,但我认为由于过于隐蔽而可能无法实现.
所以,澄清一下这个问题; 我们知道我们可以var i = new Func<int, int>(x => x)(42);但是如果没有创建实例,或者转换为Func,这可能吗?
用例
对于那些好奇(或有关)的用例是这样的:
var o …Run Code Online (Sandbox Code Playgroud) c# anonymous-methods anonymous-function self-invoking-function
为简单起见,请想象以下代码:
我想创建一个Foo:
public class Foo
{
public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并将其传递给特殊的Html Helper方法:
Html.SomeFunction(f => f.Bar);
Run Code Online (Sandbox Code Playgroud)
其定义为:
public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
Run Code Online (Sandbox Code Playgroud)
我想在这个函数中得到Bar的值,但是完全不知道如何得到它.
c# ×4
javascript ×3
clojure ×2
arguments ×1
asp.net-mvc ×1
closures ×1
function ×1
lambda ×1
lisp ×1
loops ×1
plpgsql ×1
postgresql ×1