我以为我会尝试并且聪明并创建一个我自己的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的所谓异步调用实际上是否会发生?它只是在函数调用之间吗?当然不是,那些需要很长时间才能执行的功能呢?
在我想要这样做的网站上:(简化)
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)
我可以将计数器设置为我的处理程序的另一个属性(它将复制当前值)并在我的函数中使用它,但我想,还有一种方法可以实际复制此值,不是吗?
引用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 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次这些测试,并查看了结果并获得了平均值.我对结果感到非常惊讶. …
我正在考虑如何将此转换
List.Where(X=>X>5);为非lambda表达式代码.我无法弄清楚如何让Func在这里工作.
我是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) 我正在使用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) 我正在创建一个方法来构造一个匿名方法来返回多个变量的函数,例如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)
编辑:我从用户输入中获取表达式和变量,因此一种安全的方法是最好的.
这个问题是我之前的问题实现最小化方法的继承者.在当前的问题中,我简化了我的问题,这是示例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) 这更像是一个问题.在这里.
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之前,迭代器本身不会开始运行).
需要一些帮助来理解它的概念.