在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
是否有理由使用命名的自调用函数?
例如:
(function foo()
{
alert('Hello World! Named Self Invoking Function Here');
})();
Run Code Online (Sandbox Code Playgroud)
就我的学习而言,这与匿名自我调用函数相同,没有额外的优点(你不能在调用后再调用它),也没有额外的缺点,因为它没有"污染"全局范围(我认为).
有没有什么时候命名一个像上面这样的自调用函数是有意义的?
我知道当从同一个类内部调用事务方法时,它不会在事务中运行.Spring为事务方法创建一个代理,并将它们包装在try-catch块中,并在发生异常时回滚.请考虑以下情形:
@Transactional
public void saveAB(A a, B b)
{
saveA(a);
saveB(b);
}
@Transactional
public void saveA(A a)
{
dao.saveA(a);
}
@Transactional
public void saveB(B b)
{
dao.saveB(b);
}
Run Code Online (Sandbox Code Playgroud)
假设从另一个对象调用saveAB并在saveB中发生异常,因此saveA成功完成但saveB没有成功.据我所知,即使saveA和saveB不是事务性的(因为它们是从同一个对象调用的),因为saveAB是事务性的,它仍然应该回滚.
我不明白为什么人们说自我调用打破了交易?只要调用方法是事务性的,不应该按预期工作吗?这里有什么我想念的吗?
可能重复:
"(function(){})()"和"(function(){}())"在JavaScript中功能相同吗?
我正在阅读下面的文件.
http://addyosmani.com/resources/essentialjsdesignpatterns/book/#patternity
当我查看这些示例时,自动调用匿名函数有三种形式.
一个是
(function() {
//do something
})();
Run Code Online (Sandbox Code Playgroud)
而另一个是
function() {
//do something
}();
Run Code Online (Sandbox Code Playgroud)
而另一个是
(function() {
//do something
}());
Run Code Online (Sandbox Code Playgroud)
这三种形式有什么区别?
谢谢你的阅读!
I'm trying to call a @Cacheable method from within the same class.
And it didn't work. Because of:
In proxy mode (the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation (in effect, a method within the target object that calls another method of the target object) does not lead to actual caching at runtime even if the invoked method is marked with @Cacheable. Consider using the aspectj mode in this case. Also, …
可能重复:
(function(){})()之间的差异; 和function(){}();
"(function(){})()"和"(function(){}())"在JavaScript中功能相同吗?
我只是想知道这两个例子之间是否存在差异(关于功能):
1
(function foo() {
console.log("bar")
})()
Run Code Online (Sandbox Code Playgroud)
第2
(function foo() {
console.log("bar")
}())
Run Code Online (Sandbox Code Playgroud)
两者似乎都很好......
谢谢!
有什么区别
$(function() {
// bind some event listeners
});
Run Code Online (Sandbox Code Playgroud)
和
$(function() {
// bind some event listeners
}());
Run Code Online (Sandbox Code Playgroud) javascript jquery closures addeventlistener self-invoking-function
我正在尝试使用自调用函数,以便每个函数都objects将返回不同的消息.
<script type="text/javascript">
objects = {};
for( var i = 0; i < 10; i++ ) {
objects['function'+i] = function () {
var text = ( function() { return "I am object " + i; } )();
return text;
};
}
for( var j = 0; j < 10; j++ ) {
document.write( objects['function'+j]() + "<br>" );
}
</script>
Run Code Online (Sandbox Code Playgroud)
到目前为止,上述结果如下:
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
如何使用自调用函数立即设置消息而不是与不稳定的事情联系在一起i?
我注意到在某些地方,jQuery代码包含在一个自动调用函数中,如下所示.为什么这样做,在什么情况下这是有用的,在什么情况下是不必要的样板?
function( $ ) {
...
}( jQuery );
Run Code Online (Sandbox Code Playgroud) 在某些情况下,在单个JavaScript文件中具有多个自调用函数会引发错误.获取第二个函数以返回值可以避免错误.
我有一个准系统HTML文件...
<script src="two.js"></script>
<script src="one.js"></script>
Run Code Online (Sandbox Code Playgroud)
...使用这些脚本:
// two.js
(function () {
console.log('1/2')
})()
(function () {
console.log('2/2')
})()
Run Code Online (Sandbox Code Playgroud)
// one.js
(function () {
console.log('1/1')
})()
Run Code Online (Sandbox Code Playgroud)
当我在Chrome中打开文件时,我得到了这个输出:
1/2 two.js:2
Uncaught TypeError: undefined is not a function two.js:6
1/1
Run Code Online (Sandbox Code Playgroud)
其他浏览器以自己的方式抱怨.换句话说,在同一个脚本中有两个自调用函数会导致问题.每个脚本有一个自调用函数可以正常工作.如果我注释掉第二个函数脚本two.js,则没有问题.
但是,如果我得到第二个函数来返回一个值,那么也没有问题.如果我将two.js更改为this,一切正常:
(function () {
console.log('1/2')
})()
foo = (function () {
console.log('2/2')
return 'bar'
})()
Run Code Online (Sandbox Code Playgroud)
为什么第一个版本失败而第二个版本成功?
javascript runtime-error anonymous-function self-invoking-function