我经常要绑定?一些需要参数的函数.我使用的解决方案是将函数包装在匿名函数内部.
function foo( arg_0 ) {
// do stuff with: arg_0
}
function bar() {
var abc;
// stuff happens
abc = 'some value';
attachEventHandler(elementId, 'click', function(){foo( abc );});
}
bar();
Run Code Online (Sandbox Code Playgroud)
有更优雅的方式吗?
可能重复:
自动执行匿名JavaScript函数的括号位置?
答案可能很简单,但我只是好奇.
我已经看到自编写的函数
(function() {
//...
}());
Run Code Online (Sandbox Code Playgroud)
和
(function() {
//...
})();
Run Code Online (Sandbox Code Playgroud)
包含函数的括号在调用之前关闭的位置.两者似乎都具有完全相同的效果,所以我只是想知道性能是否会有任何差异?
我有字符串包含anonymus函数定义,但我怎么称呼它.让我们说功能是这样的:
var fn_str = "function(){ alert('called'); }";
Run Code Online (Sandbox Code Playgroud)
试过eval,但得到一个错误,该函数必须有一个名字.
eval(fn_str).apply(this); // SyntaxError: function statement requires a name
Run Code Online (Sandbox Code Playgroud) 函数对象具有名为name的非标准属性.有谁知道改变它的方法?或者任何其他方式来更改匿名函数的名称?如果JavaScript可以创建动态命名的变量,那将是很好的,但它似乎只能创建公共对象属性名称.
我想做什么?
我正在努力实现这样的目标.
// o - literal object, or json
// c - string
function givemeConstructor(o, c, a}){
var a = a || 'Object';
// check other variables
var cons;
if(a === 'Object'){
cons = function(){};
for(p in o) cons.prototype[p] = o[p];
cons.name = c;
}
else{
// a way to create a constructor that inherits from a
// adds object as new prototype
}
return cons;
}
var cons = givemeConstructor({x:1,y:1, toString:function(){return '['+ x + ','+ y+'']'}, 'Point'})
Run Code Online (Sandbox Code Playgroud)
最终得到一个内省的对象.
我正在查看第13节或ECMAScript规范(第5节).匿名函数表达式初始化如下:
返回使用FormalParameterListopt指定的参数和FunctionBody指定的主体创建13.2中指定的新Function对象的结果.将正在运行的执行上下文的LexicalEnvironment作为Scope传递.如果FunctionExpression包含在严格代码中或者其FunctionBody是严格代码,则传入true作为Strict标志.
这个逻辑与初始化函数声明的方式非常相似.但是,请注意命名的funciton表达式的不同初始化方式.
- 让funcEnv成为调用NewDeclarativeEnvironment传递正在运行的执行上下文的Lexical Environment作为参数的结果
- 让envRec成为funcEnv的环境记录.
- 调用envRec的CreateImmutableBinding具体方法,将Identifier的String值作为参数传递.
- 让闭包是创建一个新的Function对象的结果,该对象在13.2中指定,其中参数由FormalParameterListopt和FunctionBody指定的body指定.传入funcEnv作为范围.如果FunctionExpression包含在严格代码中或者其FunctionBody是严格代码,则传入true作为Strict标志.
- 调用envRec的InitializeImmutableBinding具体方法,将Identifier和closure的String值作为参数传递.
- 关闭.
我知道命名/匿名函数表达式之间的一个重大区别是命名函数表达式可以在函数内递归调用,但这就是我能想到的.为什么设置如此不同?为什么需要执行这些额外的步骤?
我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因.锁定的基本用法是将资源放在Lock/unlock块中.
procedure RefreshData;
begin
DataLock;
GetData;
GetSettings;
CheckValues;
...
DataUnlock;
end;
Run Code Online (Sandbox Code Playgroud)
因为总有一对锁定/解锁我开始考虑简化锁定/解锁方法,这将在不再需要时自动解锁资源.
所以我的想法是引入新程序,该程序将输入参数作为对precedure的引用.这将使我能够使用匿名方法.
代码将是这样的:
type TBaseProc = reference to procedure;
procedure TMyObject.LockMethod(AMeth: TBaseProc);
begin
DataLock;
try
AMeth;
finally
DataUnlock;
end;
end;
procedure TForm1.RefreshData;
begin
MyObject.LockMethod(
procedure
begin
GetData;
GetSettings;
CheckValues;
...
end;
);
end;
Run Code Online (Sandbox Code Playgroud)
这种方法有任何意义,还是有更好甚至更简单的解决方案?
感谢致敬.
假设我们有这个课程:
// Provides deferred behaviour
public class Command<TResult>
{
private Func<object[], TResult> _executeFunction;
private object[] _args;
public Command(Func<object[], TResult> execution, params object[] arguments)
{
_executeFunction = execution;
_args = arguments;
}
public TResult Execute()
{
return _executeFunction(_args);
}
}
Run Code Online (Sandbox Code Playgroud)
这两个匿名函数有什么区别?
int a = 1;
int b = 4;
// a and b are passed in as arguments to the function
Command<int> sum = new Command<int>(args => (int)args[0] + (int)args[1], a, b);
// a and b are captured by the function …Run Code Online (Sandbox Code Playgroud) 我正在尝试模拟这种方法
Task<TResult> GetResultAsync<TResult>(Func<string, TResult> transformFunc)
Run Code Online (Sandbox Code Playgroud)
像这样
iMock.Setup(m => m.GetResultAsync(It.IsAny<Func<string, object>>())).ReturnsAsync(new { isPair = false });
Run Code Online (Sandbox Code Playgroud)
测试调用方法,将匿名类型传递给通用参数,例如:
instance.GetResultAsync(u => new {isPair = u == "something" }) //dont look at the function return because as generic could have diferent implementations in many case
Run Code Online (Sandbox Code Playgroud)
Moq从未将我的GetResultAsync方法与发送的参数匹配。
我正在使用Moq 4
有没有办法在Javascript中将匿名函数作为自定义回调函数传递?我有这个代码:
function notifyme(msg){
console.log(msg)
}
notifyme("msg", function(){
//do some custom redirect logic
});
Run Code Online (Sandbox Code Playgroud)
我正在尝试上面的代码,它正在执行notifyme函数,但没有进一步使用重定向代码.我知道我可以将函数名称作为回调传递,但是我没有可以通过的特定函数.这就是为什么他们发明了我猜的匿名函数.
如果有办法做到这一点真的很好.
下面的代码有效,但是我收到SonarLint的通知,因为我在流中使用了一个匿名类而不是lambda表达式,我没有看到如何改进下面的代码来避免通知:
Properties prop = new Properties();
Properties temp = new Properties();
//... add some values and keys in prop and temp
prop.putAll(temp.entrySet().stream()
.filter( entry -> !prop.containsKey(entry.getKey()))
.map( new Function<Entry<Object, Object>, Entry<String, String>>(){
@Override
public Entry<String, String> apply(Entry<Object, Object> entry) {
return new Entry<String, String>() {
@Override
public String setValue(String value) {
return value.trim().toLowerCase();
}
@Override
public String getValue() {
return ((String) entry.getValue()).trim().toLowerCase();
}
@Override
public String getKey() {
return ((String) entry.getKey()).trim().toLowerCase();
}
};
}
})
.collect(Collectors.toMap(Entry<String,String>::getKey, Entry<String,String>::getValue)));
Run Code Online (Sandbox Code Playgroud)
代码的解释:
我使用java.util中的属性类,不幸的是entrySet …
javascript ×6
c# ×2
lambda ×2
.net ×1
binding ×1
callback ×1
closures ×1
delphi ×1
delphi-xe6 ×1
ecma262 ×1
ecmascript-5 ×1
function ×1
java-8 ×1
java-stream ×1
locking ×1
moq ×1
mutex ×1
sonarlint ×1
unit-testing ×1