草庐IT

Closures

全部标签

javascript - 为什么不对对象属性使用闭包?

我目前正在用javascript编写对象,我希望使用最佳实践等以一种清晰、漂亮的方式来完成它。但我很烦恼我必须始终将this.写到地址属性,与其他OO语言不同。所以我想到了-为什么不对对象属性使用闭包?看看我的示例对象。所以不是这样,经典的方式:varMyObjConstructor=function(a,b){//constructor-initializationofobjectattributesthis.a=a;this.b=b;this.var1=0;this.var2="hello";this.var3=[1,2,3];//methodsthis.method1=funct

javascript - 在 JavaScript 中创建命名空间/类类型结构的最优雅方式

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我正在尝试确定一种方法,该方法将为我提供最优雅的方式来将我的代码包装在Namespace/Unit中,例如对象。例如GoogleMapsAPI的vara=Google.Maps.Foo();,我认为它看起来很干净。我希望它包含(如果这是正确的术语)jQueryNoConflict$也签名。到目前为止,我喜欢://Toplevelcontainerforsu

javascript - 为什么在 Javascript 模块模式中使用自执行匿名函数?

在JavaScript的模块模式中,“立即调用的函数表达式”(也称为自执行匿名函数)用作返回对象的自执行函数。自执行函数如何隐藏私有(private)变量,只暴露返回的对象。为什么普通的JavaScript函数不会发生这种情况?那么在下面的迷你模块中,为什么没有封闭的()()就不能实现同样的封装概念呢?varModule=(function(){varprivateVariable="foo",privateMethod=function(){alert('privatemethod');};return{PublicMethod:function(){alert(privateVar

javascript - 如何删除使用闭包添加的 EventListener?

这基本上是一个后续问题:Can'tpasseventtoaddEventListener:closureissue.我几乎阅读了所有相关问题,但找不到答案。下面的函数是在一个循环中执行的,其中参数是从数据数组中提取的。使用此功能,我可以将不同的/新的参数传递给事件监听器的每个实例。outerfunction允许将参数的值封装在闭包中,以便实际值可用,而不仅仅是对持有者的引用。此外,传递事件函数将事件传递给响应函数。最后,responsefunction具有所有适当的信息以响应点击事件。这很好用。问题是,我不知道以后如何删除事件监听器。我已经尝试了我能想到的一切。请帮忙。我怎样才能:re

javascript - 在 JavaScript 中使用 (function(){...})() 有什么好处

我注意到在JQuery中使用了下面的代码结构(function(){varl=this,g,y=l.jQuery,p=l.$,...})()这似乎创建了一个函数,并调用了它。采用这种方法与将函数内容内联相比有什么好处? 最佳答案 它创建一个闭包以防止与代码的其他部分发生冲突。看这个:http://docs.jquery.com/Plugins/Authoring如果您有一些其他使用$()方法的库并且您还必须保留将其与jQuery一起使用的能力,则此方法特别方便。然后你可以像这样创建一个闭包:(function($){//$()isa

go - 将闭包作为函数的参数传递

来自这个例子:https://gobyexample.com/closures如果我们改变:fmt.Println(nextInt())fmt.Println(nextInt())fmt.Println(nextInt())到fmt.Println(intSeq())fmt.Println(intSeq())fmt.Println(intSeq())gorun将失败并出现错误:./prog.go:32:5:PrintlnargintSeq()isafuncvalue,notcalled但是从这个例子来看:https://gobyexample.com/recursionfmt.Prin

go - 使用命名返回类型时未使用变量

为什么我可以通过以下方式在Go中定义迭代器:funcf()func()int{i:=1returnfunc()int{i++returni}}但这会导致变量未使用错误(iisnotused)吗?funcf()func()int{i:=1returnfunc()(iint){i++return}}主要功能:funcmain(){iter:=f()fmt.Println(iter())fmt.Println(iter())fmt.Println(iter())fmt.Println(iter())}对我来说,这两个版本做的完全一样:它们使用f作为迭代器。f使用闭包(更具体地说是i)。第一个

go - 使用方法而不是闭包更好吗?

我有一个简单的数据类型,它只包含一个uint32,但是可以对这个数据执行很多操作。使用此数据的所有文件都位于同一个包中,因此可以访问结构内未导出的uint32,这是不可取的。我最近了解了闭包的强大功能,想知道是使用包含执行任务的函数的结构更好,还是将uint32存储在结构中,然后仅使用带有结构接收者的方法。这是OpenGL着色器的基本表示。方法和闭包选项,对于调用者来说看起来是一样的,但在幕后执行不同。关闭:typeShaderstruct{getIDfunc()uint32deletefunc()}funcCreateShader(shaderstring)Shader{varidu

for-loop - 字符串 slice 的范围不一致

这段代码:import"fmt"import"time"funcmain(){string_slice:=[]string{"a","b","c"}for_,s:=rangestring_slice{gofunc(){time.Sleep(1*time.Second)fmt.Println(s)}()}time.Sleep(3*time.Second)}产生输出“ccc”,而这段代码:import"fmt"funcmain(){string_slice:=[]string{"a","b","c"}for_,s:=rangestring_slice{s="asd"fmt.Println(

go - 关于 Golang 中 lambda 函数/闭包的一些困惑

packagemainimport("fmt")funcmain(){f,val,val1:=fibonacci()fmt.Println(val,val1)fori:=0;iHereismycodeonslovingfibonacciwithoutusingrecursionwhenIreadaboutlambdafunction/closure.AndtheGoDocumentarysaysaclosurewillcapturesomeexternalstate.Myunderstandingistheclosurewillkeepacopyofstateofthefunction