我正在浏览JIT的代码,我看到了这个:
var isGraph = ($type(json) == 'array');
var ans = new Graph(this.graphOptions);
if(!isGraph)
//make tree
(function (ans, json) {
ans.addNode(json);
for(var i=0, ch = json.children; i<ch.length; i++) {
ans.addAdjacence(json, ch[i]);
arguments.callee(ans, ch[i]);
}
})(ans, json);
else
//make graph
(function (ans, json) {
var getNode = function(id) {
for(var w=0; w<json.length; w++) {
if(json[w].id == id) {
return json[w];
}
}
return undefined;
};
Run Code Online (Sandbox Code Playgroud)
那些匿名函数的目的是什么?他们立即超出范围,对吧?
为何使用:
(function (ans, json) {
ans.addNode(json);
for(var i=0, ch = json.children; i<ch.length; i++) {
ans.addAdjacence(json, ch[i]); …Run Code Online (Sandbox Code Playgroud) 我正在尝试等待,然后在数组中的所有图像都已完成加载(使用.complete)时收到消息,根据此处的答案.因此我设置了如下的无限循环.但是,当我运行这个时,我得到一个错误,即没有定义checkForAllImagesLoaded().这段代码正在通过书签运行,因此它全部包含在一个匿名函数结构中(如下所示).如果我在该构造之外重新定义我的函数和变量,它就可以工作.但这似乎是编写bookmarklet的一种糟糕方式.我怎样才能解决这个问题,以便在setTimeout之后仍能识别该函数?
(function() {
//var images = array of images that have started loading
function checkForAllImagesLoaded(){
for (var i = 0; i < images.length; i++) {
if (!images[i].complete) {
setTimeout('checkForAllImagesLoaded()', 20);
return;
}
}
}
checkForAllImagesLoaded();
})();
Run Code Online (Sandbox Code Playgroud) 我的直觉是,在这样的匿名函数中封装代码块是个好主意:
(function() {
var aVar;
aVar.func = function() { alert('ronk'); };
aVar.mem = 5;
})();
Run Code Online (Sandbox Code Playgroud)
因为我不再需要aVar了,所以我假设垃圾收集器会aVar在超出范围时删除.这是正确的吗?或者是口译员足够聪明,看到我不再使用变量并立即清理它?是否有任何理由,如风格或可读性,我应该不使用匿名函数这种方式?
另外,如果我命名函数,如下所示:
var operations = function() {
var aVar;
aVar.func = function() { alert('ronk'); };
aVar.mem = 5;
};
operations();
Run Code Online (Sandbox Code Playgroud)
不operations那么必然留下来,直到它超出范围?或者口译员可以立即告诉它何时不再需要?
我还想澄清一点,我不一定谈论全球范围.考虑一个看起来像的块
(function() {
var date = new Date(); // I want to keep this around indefinitely
// And even thought date is private, it will be accessible via this HTML node
// to other scripts. …Run Code Online (Sandbox Code Playgroud) 在John Resig的书"Pro Javascript技术"中,他描述了一种使用以下代码生成动态对象方法的方法:
// Create a new user object that accepts an object of properties
function User(properties) {
// Iterate through the properties of the object, and make sure
// that it's properly scoped (as discussed previously)
for (var i in properties) {
(function() {
// Create a new getter for the property
this["get" + i] = function() {
return properties[i];
};
// Create a new setter for the property
this["set" + i] = function(val) {
properties[i] = val;
}; …Run Code Online (Sandbox Code Playgroud) 如果我尝试执行一个脚本,其唯一的源代码行是一个对象:
{prop:'value'}
Run Code Online (Sandbox Code Playgroud)
它解析得很好(在V8和UglifyJS中).类似地,我可以将一个字符串或数字作为源代码放在一起,并且没有报告语法错误.
然而,V8和UglifyJS都在抱怨这个问题:
function(){}
Run Code Online (Sandbox Code Playgroud)
我得到Uncaught SyntaxError: Unexpected token (.
当第一个例子中的对象没问题时,为什么会中断?函数不仅仅是javascript中的对象吗?
我意识到声明一个匿名函数而不执行它将不会做任何事情; 那不是问题.我想知道它为什么会导致解析错误.
我正在尝试学习PHP,现在我陷入了"静态匿名函数".
我在教程中找到了这个(http://www.slideshare.net/melechi/php-53-part-2-lambda-functions-closures-presentation)
"面向对象
- Lambda函数是闭包,因为它们自动绑定到创建它们的类的作用域.
$this范围内并不总是需要' '.- 删除'
$this'可以节省内存.- 您可以通过将Lambda函数声明为静态来阻止此行为."
这段代码有什么问题?
我收到此错误:
解析错误:解析错误,期望第11行的C:\ wamp\www\z-final\a.php中的"T_PAAMAYIM_NEKUDOTAYIM"
为什么这段代码行不起作用"return static function(){var_dump($ this);};" ?
class foo
{
public function getLambda()
{
return function(){var_dump($this);};
}
public function getStaticLambda()
{
return static function(){var_dump($this);};
}
}
$foo = new foo();
$lambda = $foo->getLambda();
$staticLambda = $foo->getStaticLambda();
$lambda();
$staticLambda();
Run Code Online (Sandbox Code Playgroud) 我想知道Delphi中是否有一种方法可以为表单控件事件分配匿名方法.
例如:
Button1.OnClick := procedure (Sender: TObject) begin ShowMessage('') end;
Run Code Online (Sandbox Code Playgroud)
当然这给了我一个错误
[dcc32错误] Control.Controller.pas(51):E2009不兼容的类型:'方法指针和常规程序'
这是因为该方法必须属于一个对象,但它不再是匿名的.
也许有一些解决方法
我_用作占位符来创建匿名函数,问题是我无法预测Scala将如何转换我的代码.更确切地说,它错误地确定了我想要的"大"匿名函数的大小.
List(1,2,3) foreach println(_:Int) //error !
List(1,2,3) foreach (println(_:Int)) //work
List(1,2,3) foreach(println(_:Int)) //work
Run Code Online (Sandbox Code Playgroud)
使用-Xprint:typer我可以看到Scala将第一个转换为"一个大的匿名函数":
x$1 => List(1,2,3) foreach(println(x$1:Int))
Run Code Online (Sandbox Code Playgroud)
工作的第2个3号是正确的转变成我想要的.
... foreach (x$1 => println(x$1:Int))
Run Code Online (Sandbox Code Playgroud)
为什么这个?规则是什么?
lambda scala anonymous-function partial-application scala-placeholder-syntax
我正在读一本名叫"John Ninja的秘密"的好书,由John Resig和Bear Bibeaoult撰写.在第3.2章中,它给出了一个例子;
var canFly = function(){ return true; };
Run Code Online (Sandbox Code Playgroud)
然后它说;
创建匿名函数并将其分配给名为canFly的全局变量.由于JavaScript的功能特性,可以通过此引用调用该函数作为canFly().在这方面,它几乎在功能上等同于声明一个名为"canFly"的命名函数,但并不完全相同.一个主要区别是函数的name属性是"",而不是"canFly".
但是当我尝试在Chrome的开发者工具上执行该示例并检查函数的name属性时canFly,它返回值"canFly"而不是空字符串.
canFly.name;
// > "canFly"
Run Code Online (Sandbox Code Playgroud)
分配给变量的匿名函数在前几天没有名称吗?如果是这样,发生了什么变化?或者作者犯了错误?
我已设法将此问题减少到此:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Threading;
procedure Foo(AString: string);
var
LTask : ITask;
capturedString : string;
procedure Nested;
begin
try
WriteLn('Nested : ' + capturedString); { ! EIntOverflow (Win32) here }
except on E : Exception do
WriteLn(E.Message);
end;
end;
begin
capturedString := AString;
WriteLn('Local : ' + capturedString);
Nested;
LTask := TTask.Create(
procedure
procedure AnonNested;
begin
WriteLn(capturedString); { Removing this eliminates the problem }
end;
begin
end);
end;
begin
Foo('foo');
ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)
capturedString从嵌套方法中访问变量时,变量会被破坏.一个Win32编译加薪EIntOverflow,一个Win64的编译写出一个(腐败)空字符串-无论是构建可以挑起到AV或其他异常的一些操作,但是在所有情况下,参照本地变量进入时被破坏Nested …