Tag: closures

如何在Playground中运行asynchronouscallback

许多Cocoa和CocoaTouch方法在Objective-C和Swift中的闭包中都实现了完成callback。 但是,在Playground中尝试这些时,完成不会被调用。 例如: // Playground – noun: a place where people can play import Cocoa import XCPlayground let url = NSURL(string: "http://stackoverflow.com") let request = NSURLRequest(URL: url) NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() { response, maybeData, error in // This block never gets called? if let data = maybeData { let contents = NSString(data:data, encoding:NSUTF8StringEncoding) println(contents) } else { […]

在Java中,函数指针最接近什么替代?

我有一个约十行代码的方法。 我想创build更多的方法来完成同样的事情,除了一个小的计算,将改变一行代码。 这是传递函数指针来replace那一行的完美应用程序,但Java没有函数指针。 我最好的select是什么?

如何将JSvariables的值(不是引用)传递给函数?

这里是我试图运行的一个简化版本: for (var i = 0; i < results.length; i++) { marker = results[i]; google.maps.event.addListener(marker, 'click', function() { change_selection(i); }); } 但我发现每个侦听器都使用results.length(for循环终止时的值)的值。 我如何添加监听器,使得每次使用我添加它时的值,而不是对i的引用?

Javascript循环中的事件处理程序 – 需要closures?

我正在处理一些我从其他人手中接过的html和Javascript代码。 该页面每十秒钟重新载入一个数据表(通过asynchronous请求),然后使用一些DOM代码重新构build表。 有问题的代码看起来像这样: var blah = xmlres.getElementsByTagName('blah'); for(var i = 0; i < blah.length; i++) { var td = document.createElement('td'); var select = document.createElement('select'); select.setAttribute("…", "…"); select.onchange = function() { onStatusChanged(select, callid, anotherid); }; td.appendChild(select); } 但是,如果为<select>元素触发onchange事件,则表中的每个<select>都会将相同的值传递给onStatusChanged()方法(我已经validation了在循环的每次迭代中, callid和anotherid正在被赋予新的,不同的值)。 我怀疑这是发生,因为我设置事件处理程序的性质,使用select.onchange = function()语法。 如果我理解这是如何工作的,那么这个语法将onchange事件的闭包设置为一个引用这两个引用的函数,这个引用最终具有在循环的最后一次迭代中设置的最终值。 当事件触发时, callid和anotherid引用的值是最后一次迭代中设置的值,而不是单个迭代中设置的值。 有没有办法,我可以复制我传递给onStatusChanged()参数的值? 我已经改变了标题,以更好地反映问题和接受的答案。

foreach标识符和closures

在下面的两个片段中,第一个是安全还是第二个? 通过安全我的意思是每个线程保证从线程创build相同的循环迭代调用Foo的方法? 或者你必须复制引用到一个新的variables“本地”到循环的每个迭代? var threads = new List<Thread>(); foreach (Foo f in ListOfFoo) { Thread thread = new Thread(() => f.DoSomething()); threads.Add(thread); thread.Start(); } – var threads = new List<Thread>(); foreach (Foo f in ListOfFoo) { Foo f2 = f; Thread thread = new Thread(() => f2.DoSomething()); threads.Add(thread); thread.Start(); } 更新:正如Jon Skeet的回答所指出的那样,这与线程无关。

在PHP 5.3.0中,“use”标识符的function是什么?

我正在检查一些PHP 5.3.0function,并在网站上看到一些相当有趣的代码: public function getTotal($tax) { $total = 0.00; $callback = /* This line here: */ function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($this->products, $callback); return round($total, 2); } 作为匿名函数的例子之一。 有人知道吗? 任何文件? 它看起来很邪恶,是否应该使用它?

在for循环中分配点击处理程序

我有几个div的#mydiv1 , #mydiv2 , #mydiv3 ,…并想分配点击处理程序给他们: $(document).ready(function(){ for(var i = 0; i < 20; i++) { $('#question' + i).click( function(){ alert('you clicked ' + i); }); } }); 但是,当点击#mydiv3 (至于其他点击),而不是显示'you clicked 3' ,我得到'you clicked 20' 。 我究竟做错了什么?

这个JavaScript成语的基础是什么:var self = this?

我在WebKit HTML 5 SQL Storage Notes演示的源代码中看到以下内容: function Note() { var self = this; var note = document.createElement('div'); note.className = 'note'; note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false); note.addEventListener('click', function() { return self.onNoteClick() }, false); this.note = note; // … } 作者在某些地方(函数体)使用self,在其他地方使用self (方法的参数列表中定义的函数体)。 这是怎么回事? 现在我已经注意到了,我会开始看到它吗?

为什么Python lambda有用?

我试图找出Python lambda。 拉姆达是那些在现实生活中应该被遗忘的“有趣”的语言项目之一吗? 我确信有一些边缘情况可能需要,但是由于它的模糊性,它在未来版本中的重新定义的可能性(基于它的各种定义的我的假设)和降低的编码清晰度 – 是否应该被避免? 这让我想起了Ctypes溢出(缓冲区溢出) – 指向顶部variables和重载来设置其他字段值。 这感觉就像是一个技术人员的娴熟,但维修编码器的噩梦。

.NET中的“闭包”是什么?

什么是封闭 ? 我们有他们在.NET? 如果它们确实存在于.NET中,请提供一个代码片段(最好用C#)来解释它? 编辑:我经历了Jon Skeet的文章 ,了解什么是闭包,以及如何在.NET中使用它们。