标签: anonymous-function

Javascript:为什么在这里使用匿名函数?

我正在浏览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)

javascript anonymous-function

8
推荐指数
1
解决办法
634
查看次数

函数调用本身不起作用(无限循环,Javascript)

我正在尝试等待,然后在数组中的所有图像都已完成加载(使用.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)

javascript function definition callback anonymous-function

8
推荐指数
1
解决办法
4067
查看次数

我应该在匿名JavaScript函数中封装功能块吗?

我的直觉是,在这样的匿名函数中封装代码块是个好主意:

(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)

javascript garbage-collection scope anonymous-function

8
推荐指数
1
解决办法
2197
查看次数

"这个"在一个匿名函数里面?

在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)

javascript anonymous-function

8
推荐指数
1
解决办法
6231
查看次数

为什么匿名函数在javascript中有自己的语法错误?

如果我尝试执行一个脚本,其唯一的源代码行是一个对象:

{prop:'value'}
Run Code Online (Sandbox Code Playgroud)

它解析得很好(在V8和UglifyJS中).类似地,我可以将一个字符串或数字作为源代码放在一起,并且没有报告语法错误.

然而,V8和UglifyJS都在抱怨这个问题:

function(){}
Run Code Online (Sandbox Code Playgroud)

我得到Uncaught SyntaxError: Unexpected token (.

当第一个例子中的对象没问题时,为什么会中断?函数不仅仅是javascript中的对象吗?

我意识到声明一个匿名函数而不执行它将不会做任何事情; 那不是问题.我想知道它为什么会导致解析错误.

javascript syntax grammar parsing anonymous-function

8
推荐指数
2
解决办法
9493
查看次数

PHP静态匿名函数真的有用吗?

我正在尝试学习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)

php anonymous-function

8
推荐指数
2
解决办法
3649
查看次数

Delphi中有没有办法为按钮事件分配匿名方法?

我想知道Delphi中是否有一种方法可以为表单控件事件分配匿名方法.

例如:

Button1.OnClick := procedure (Sender: TObject) begin ShowMessage('') end;
Run Code Online (Sandbox Code Playgroud)

当然这给了我一个错误

[dcc32错误] Control.Controller.pas(51):E2009不兼容的类型:'方法指针和常规程序'

这是因为该方法必须属于一个对象,但它不再是匿名的.

也许有一些解决方法

delphi events anonymous-function

8
推荐指数
1
解决办法
3511
查看次数

管理下划线以定义匿名函数的规则是什么?

_用作占位符来创建匿名函数,问题是我无法预测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

8
推荐指数
1
解决办法
1188
查看次数

为什么javascript中的匿名函数有名字?

我正在读一本名叫"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)

分配给变量的匿名函数在前几天没有名称吗?如果是这样,发生了什么变化?或者作者犯了错误?

javascript anonymous-function

8
推荐指数
1
解决办法
534
查看次数

在嵌套方法中访问时,由闭包捕获破坏的局部变量

我已设法将此问题减少到此:

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 …

delphi closures anonymous-function delphi-10-seattle

8
推荐指数
1
解决办法
179
查看次数