def maker(n): def action(x): return x ** n return action f = maker(2) print(f) print(f(3)) print(f(4)) g = maker(3) print(g(3)) print(f(3)) # still remembers 2 为什么嵌套函数会记住第一个值2即使maker()已经返回并在调用action()的时候退出?
鉴于: typealias Action = () -> () var action: Action = { } func doStuff(stuff: String, completion: @escaping Action) { print(stuff) action = completion completion() } func doStuffAgain() { print("again") action() } doStuff(stuff: "do stuff") { print("swift 3!") } doStuffAgain() 有什么办法可以使Action?types的completion参数(和action ) Action? 并保持@escaping ? 更改types会导致以下错误: error: @escaping attribute only applies to function types 除去@escaping属性,代码编译并运行,但是由于completion闭包正在逃避函数的作用域,所以似乎并不正确。
循环中的闭合造成我的问题。 我想我必须做另一个函数返回一个函数来解决这个问题,但我不能让它与我的jQuery代码一起工作。 这是一个简单的基本问题: function foo(val) { alert(val); } for (var i = 0; i < 3; i++) { $('#button'+i).click(function(){ foo(i); }); } 自然地,点击三个button中的任何一个都会给出一个警告。3.我想要的function是点击button1将会发出警告,说1,button2会说2。 我怎样才能做到这一点?
我有一个for循环封闭ajax调用,我试图确定从for循环索引传递给callback函数的最佳方法。 这是我的代码: var arr = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]; for (var i = 0; i < arr.length; i++) { $.ajaxSetup({ cache:false }) $.getJSON("NatGeo.jsp", { ZipCode: arr[i], Radius: document.getElementById("radius").value, sensor: false }, function(data) { DrawZip(data, arr[i]); } ); } 目前,由于asynchronousajax调用,只传递了arr数组的最后一个值。 除了同步运行ajax调用之外,如何将arr数组的每次迭代传递给callback函数?
我有以下代码: for(var i = 0; i < list.length; i++){ mc_cli.get(list[i], function(err, response) { do_something(i); }); } mc_cli是到memcached数据库的连接。 正如你可以想象的那样,callback函数是asynchronous的,因此可以在for循环已经结束时执行。 另外,当以这种方式调用do_something(i)它总是使用for循环的最后一个值。 我以这种方式尝试了封闭 do_something((function(x){return x})(i)) 但显然这又一次使用了for循环索引的最后一个值。 我也尝试在for循环之前声明一个函数,如下所示: var create_closure = function(i) { return function() { return i; } } 然后打电话 do_something(create_closure(i)()) 但是又一次没有成功,返回值始终是for循环的最后一个值。 有人可以告诉我,我做什么closures错了吗? 我以为我了解他们,但我不明白为什么这是行不通的。
有人可以解释吗? 我了解他们背后的基本概念,但我经常看到他们互换使用,我感到困惑。 而现在我们在这里,它们与常规函数有什么不同呢?
看到: for (var i in this.items) { var item = this.items[i]; $("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"http://img.dovov.comshowcase/icon-"+item.id+".png\" /></li>"); $("#showcasebutton_"+item.id).click(function() { alert(item.id); self.switchto(item.id); }); } 问题在于,惊动item.id始终是数组中最后一个项目的标识(this.items)。 如何解决?
我如何在Javascript中创build静态variables?