标签: anonymous-function

Javascript匿名函数和全局变量

我以为我会尝试并且聪明并创建一个我自己的Wait函数(我意识到还有其他方法可以做到这一点).所以我写道:

var interval_id;
var countdowntimer = 0;

function Wait(wait_interval) {
  countdowntimer = wait_interval;

  interval_id = setInterval(function() {
    --countdowntimer <=0 ? clearInterval(interval_id) : null;
  }, 1000);

  do {} while (countdowntimer >= 0);
}

// Wait a bit: 5 secs
Wait(5);
Run Code Online (Sandbox Code Playgroud)

这一切都有效,除了无限循环.检查后,如果我取出While循环,则按预期输入匿名函数5次.很明显,全局变量countdowntimer递减了.

但是,如果我检查countdowntimer的值,在While循环中,它永远不会下降.尽管在While循环中调用了匿名函数,但这是事实!

很明显,不知何故,倒计时器有两个值浮动,但为什么呢?

编辑

好的,所以我理解(现在)Javascript是单线程的.而那 - 有点 - 回答我的问题.但是,在处理这个单线程的那一点上,使用setInterval的所谓异步调用实际上是否会发生?它只是在函数调用之间吗?当然不是,那些需要很长时间才能执行的功能呢?

javascript global-variables anonymous-function setinterval

4
推荐指数
1
解决办法
5245
查看次数

javascript:在函数(){}中使用当前的for循环计数器值?

在我想要这样做的网站上:(简化)

myHandlers = new Array();
for(var i = 0; i < 7; i++) {
  myHandlers.push(new Handler({
    handlerName: 'myHandler'+i, // works, e.g. ->myHandler1, 2, 3 etc.
    handlerFunc: function(bla) { /*...*/ alert(i); } // doesn't work,all return 7
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以将计数器设置为我的处理程序的另一个属性(它将复制当前值)并在我的函数中使用它,但我想,还有一种方法可以实际复制此值,不是吗?

javascript scope for-loop copy anonymous-function

4
推荐指数
1
解决办法
5149
查看次数

PHP强制实例Closure,排序

引用PHP:

目前使用Closure类实现匿名函数.这是一个实现细节,不应该依赖.

现在,那说,以下检查被认为是不可靠的:

function myFunction(Closure $callback){}

if(!($callback instanceof Closure)){}
Run Code Online (Sandbox Code Playgroud)

这让我们使用is_callable().这很好,但如果一个人需要一个真正的" 封闭 ",(作为一个论点,或者说是什么),那么is_callable()就不够严格了.以下当然转储bool(true)每个:

function myFunction(){}

class MyClass{
    public function __invoke(){}
}

var_dump(is_callable('myFunction'));
var_dump(is_callable(new MyClass));
Run Code Online (Sandbox Code Playgroud)

怎么样,而不依赖于Closure类(给出的实际上是不可靠的)可以在一个严格确定一个" 封闭 "?


更新

在我看来,我正朝着糟糕的设计方向前进.然而,尽管这个问题得到了回答,但我认为如果有人能够提出所提问题的答案,如果不是纯粹为了它的学术要素,我将不胜感激.

更新(再次)

自PHP 5.4发布以来(前一段时间),该Closure类型不再是"实现细节",可以依赖.function f(Closure $g) { }一切都很好.

php closures types anonymous-function

4
推荐指数
1
解决办法
3239
查看次数

PHP闭包给出了奇怪的性能行为

今天早些时候我正在开发一个PHP 5.3+应用程序,这意味着我可以自由使用PHP闭包.太棒了,我想!然后我遇到了一段代码,其中使用功能性PHP代码会使事情变得更容易,但是,虽然我有一个合乎逻辑的答案,但它让我想知道直接调用封闭内容array_map()和传递它之间的性能影响是什么作为一个变量.即以下两个:

$test_array = array('test', 'test', 'test', 'test', 'test' );
array_map( function ( $item ) { return $item; }, $test_array );
Run Code Online (Sandbox Code Playgroud)

$test_array = array('test', 'test', 'test', 'test', 'test' );
$fn = function ( $item ) { return $item; };
array_map( $fn, $test_array );
Run Code Online (Sandbox Code Playgroud)

正如我所想,后者确实更快,但差别并不大.实际上,重复这些相同的测试10000次并取平均值的差异为0.05秒.甚至可能是侥幸.

这让我更加好奇.怎么样create_function()和关闭?同样,经验告诉我,create_function()当它array_map()创建一个函数,评估它,然后存储它时,它应该更慢.而且,正如我所想的那样,create_function()确实更慢.这就是全部array_map().

然后,我不知道为什么我这样做,但是我做了,我检查了create_function()保存它之间的差异和闭包之间的区别.没有处理,没有任何东西,只是简单地传递一个字符串,并返回该字符串.

测试成了:

$fn = function($item) { return $item; };
$fn('test');
Run Code Online (Sandbox Code Playgroud)

$fn = create_function( '$item', 'return $item;' );
$fn('test');
Run Code Online (Sandbox Code Playgroud)

我分别运行了10000次这些测试,并查看了结果并获得了平均值.我对结果感到非常惊讶. …

php performance closures anonymous-function

4
推荐指数
1
解决办法
2484
查看次数

如何在没有Lambde表达式的情况下编写Func?

我正在考虑如何将此转换 List.Where(X=>X>5);为非lambda表达式代码.我无法弄清楚如何让Func在这里工作.

c# lambda anonymous-function

4
推荐指数
1
解决办法
119
查看次数

java 8中lambda函数的语法

我是java的新手,我不知道如何编写一个简单的lambda函数.我试着阅读一些文章,比如这篇文章,但我没有设法编译,因为我得到语法错误.

我希望用F这个代码替换函数?-function

class Test {
  private int N;
  public Test (int n) {
      N = n;
  }

  private int f (int x) {                   /* <== replace this */
      return 2*x;
  }

  public void print_f () {
      for (int i = 0; i < this.N; i++)
          System.out.println (f(i));        /* <== with lambda here*/
  }

  public static void main (String[] args) {
      int n = 10;
      if (args.length == 1)
          n = Integer.parseInt(args[0]);
      Test t = new …
Run Code Online (Sandbox Code Playgroud)

java lambda anonymous-function java-8

4
推荐指数
1
解决办法
2276
查看次数

未捕获的TypeError:无法读取未定义的属性'hasOwnProperty'

我正在使用fabric.js在画布上绘制一些文本.我有一个创建文本标签的功能.我想让标签在选中时运行一个功能.这个的语法是label.on('selected', functionToCall());当我使函数成为一个匿名的内部函数时这很好用,但当我把它作为一个单独的函数分解时,我得到一个未捕获的TypeError : Cannot read property 'hasOwnProperty' of undefined. 我究竟做错了什么?

以下代码对我不起作用.这是jsfiddle 上的破解代码,以及使用匿名函数设置的版本.

"use strict";

var canvas = new fabric.Canvas('c', {selection: false}),
  position = 50;

function onLabelSelection(theLabel) {
  if (theLabel.hasOwnProperty('edge')) {
    selectedEdge = theLabel.edge;
  } else {
    selectedEdge = null;
  }
}

function createLabel() {
  var label;

  label = new fabric.Text('Hello World', {
    left: position,
    top: position
  });
  position += 50;

  label.edge = null;

  label.on('selected', onLabelSelection(this));

  return label;
}

canvas.on('mouse:up', function() {
  var newLabel …
Run Code Online (Sandbox Code Playgroud)

javascript anonymous-function javascript-events

4
推荐指数
1
解决办法
2万
查看次数

Python - 由变量定义的精确参数数量

我正在创建一个方法来构造一个匿名方法来返回多个变量的函数,例如f(x,y,z)= b.我希望用户能够传递变量列表:

def get_multivar_lambda(expression, variables=["x"])
Run Code Online (Sandbox Code Playgroud)

然后我希望返回的匿名函数采用精确的len(variables)参数(基于列表索引的位置或基于列表中字符串的关键字).我知道我可以使用*args和检查长度,但这似乎不优雅.

这可能吗?我怎么能这样做?

这是我如何为一个变量(其中seval是一个来自模块simple_eval)的例子:

def get_lambda(expression, variable="x"):                                       
    return lambda arg: seval(expression.replace(variable, str(arg))) 
Run Code Online (Sandbox Code Playgroud)

这是我如何通过检查arguments*传递的长度来做到的:

def get_multivar_lambda(expression, variables=["x"]):

    def to_return(*arguments):
        if len(variables) != len(arguments):
            raise Exception("Number of arguments != number of variables")
        for v, a in zip(variables, arguments):
            expression.replace(v, a)
        return seval(expression)

    return to_return
Run Code Online (Sandbox Code Playgroud)

编辑:我从用户输入中获取表达式和变量,因此一种安全的方法是最好的.

python lambda anonymous-function variadic-functions

4
推荐指数
1
解决办法
541
查看次数

在Fortran中实现匿名函数

这个问题是我之前的问题实现最小化方法的继承者.在当前的问题中,我简化了我的问题,这是示例MATLAB代码.我想在Fortran中实现它.

%Script script1.m 
clear vars;
close all;
clc;

fun1 = @(x1,x2) 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10;

lower = -2;
upper = 0;
fun5 = fun15(fun1);
%fun5 is 'intermediate' function

%calling minimization function
[location,value]=minimize1(fun5,lower,upper)
Run Code Online (Sandbox Code Playgroud)

在script1.m中,我创建了一个函数句柄,fun1并希望为其赋值,如图所示fun15.m

%fun15.m
function fun2 = fun15( fun1 )
arr1 = [4,5];
arr2 = [-2,3];
fun2 = @(a) fun1( ( arr1(1) + a*arr2(1)) , ( arr1(2) + a*arr2(2)));
%fun2 = @(a) @(x4,y4,x5,y5)  3*(x4+a*x5)^2 + 4*(y4+a*y5)^2 + 5*(x4+a*x5) + 6*(y4+a*y5) …
Run Code Online (Sandbox Code Playgroud)

matlab fortran anonymous-function

4
推荐指数
1
解决办法
955
查看次数

C#7.0中的本地函数与foreach或循环有何不同?

这更像是一个问题.在这里.

C#7.0添加了一个名为"Local Function"的新功能.以下是代码段.

public int Fibonacci(int x)
{
    if (x < 0) throw new ArgumentException("Less negativity please!", nameof(x));
    return Fib(x).current;

    (int current, int previous) Fib(int i)
    {
        if (i == 0) return (1, 0);
        var (p, pp) = Fib(i - 1);
        return (p + pp, p);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是,它对相同的方法进行递归调用.我们可以通过正常的foreach轻松实现这一目标.那为什么一个本地功能.

MSDN

作为迭代器实现的方法通常需要一个非迭代器包装器方法,以便在调用时热切地检查参数.(在调用MoveNext之前,迭代器本身不会开始运行).

需要一些帮助来理解它的概念.

.net c# foreach anonymous-function c#-7.0

4
推荐指数
1
解决办法
235
查看次数