leaflet-draw直接调用方法激活

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leaflet-draw直接调用方法激活相关的知识,希望对你有一定的参考价值。

参考技术A 初始化

GOD.Circle =new L.Draw.Circle(GOD.LMap, shapeOptions: weight:1,fillOpacity:0.35);

GOD.Rectangle =new L.Draw.Rectangle(GOD.LMap, metric:'km',showArea:true,shapeOptions: weight:1,fillOpacity:0.35);

GOD.Polygon =new L.Draw.Polygon(GOD.LMap, showArea:true,showLength:true,metric: ['km','km'],allowIntersection:false,shapeOptions:weight:1,fillOpacity:0.35);

GOD.Polyline =new L.Draw.Polyline(GOD.LMap, showLength:true,metric: ['km','km'],allowIntersection:false,shapeOptions: weight:4,fillOpacity:0.35);

GOD.Marker =new L.Draw.Marker(GOD.LMap, shapeOptions: weight:1,fillOpacity:0.35);

GOD.Edit =new L.EditToolbar.Edit(GOD.LMap, featureGroup: GOD.commonLayer,);

GOD.Delete =new L.EditToolbar.Delete(GOD.LMap, featureGroup: GOD.commonLayer);

使用

GOD.Edit.enable();//激活

GOD.Edit.disable();//禁止

GOD.Edit.save();//保存

从函数中退出以减少激活对象比递归或调用嵌套函数更好吗?

【中文标题】从函数中退出以减少激活对象比递归或调用嵌套函数更好吗?【英文标题】:Is it better to exit from a Function to cut-down on Activation Objects, than recursively or calling nested functions? 【发布时间】:2013-01-30 18:46:44 【问题描述】:

在 JavaScript 和其他语言中,我听说过在调用方法/函数时会创建激活对象。为了优化和保持良好的性能,听起来开发人员应该限制调用的函数数量。

现在如果没有办法,你必须调用多个方法,是不是一个接一个地调用一个方法,像这样:

myFunc1();
myFunc2();
myFunc3();

// or...
var myFuncs = [myFunc1, myFunc2, myFunc3];
for(var a=0, aLen=myFuncs.length; a<aLen; a++) 
  myFuncs[a]();

或者,像这样嵌套它们:

function myFunc1() 
  // Do something...
  myFunc2();


function myFunc2() 
  // Do Something else...
  myFunc3();


function myFunc3() 
  //Do one last thing.


//Start the execution of all 3 methods:
myFunc1();

我假设使用第一种技术更有意义,因为它会回到以前的范围并释放最后一个激活对象...但是如果有人可以确认这一点, 我真的很想知道!

谢谢

【问题讨论】:

我相信按顺序调用这些方法会有最好的性能。循环中的额外变量存在开销,嵌套函数调用将使每个函数的激活对象保持活动状态,直到所有函数都完成执行。 以最合乎逻辑(和可读性)的方式构建代码。不要嵌套这些函数,除非它们实际上彼此依赖以特定顺序执行某些操作,例如,如果在myFunc1() 的一部分中,它实际上需要myFunc2() 的结果。仅当您确实注意到问题时才担心性能。 (注意:您展示的示例中没有任何递归。) 您使用嵌套函数调用 (CPS) 而不是默认线性函数的原因是什么,是否涉及一些异步代码? @nnnnnn 我意识到示例中没有递归,但递归也是一种相互嵌套的函数形式,可能会导致激活对象的深层链。 @Bergi 我主要是在问一般情况下哪个对性能更好。例如,如果您正在为解析/导出工具编写一些子例程(并且这些子例程仅相互依赖),您宁愿一个接一个地单独调用这些方法/在数组中迭代它们,还是将它们嵌套在每个方法的执行顺序?这基本上是我的问题。 【参考方案1】:

为了优化和保持良好的性能,听起来开发人员应该限制调用的函数数量。

是和不是。函数(或更一般地,子例程)在那里被调用,不这样做是没有意义的。如果您可以通过引入另一个函数来使您的代码更加干燥,那么就这样做。

唯一合理的地方是不使用它们的高性能循环运行数千次,几乎没有什么工作,而函数调用会增加显着的开销。不要尝试prematurely optimize!

此外,有些语言不能很好地处理递归,您需要将递归函数调用转换为循环,以防止堆栈溢出异常。但是,这种情况也很少见。

是一个接一个地调用方法,还是嵌套它们?

这取决于,因为这两种技术做不同的事情。对于 #1,只有 3 个 独立 函数,它们相互调用。相比之下,#2 定义了总是相互调用的函数——没有myFunc3,你就无法获得myFunc2。这是故意的吗?

如果是,那么这个嵌套没有问题。两个额外的堆栈层不会损害您的性能。

【讨论】:

好的,很高兴知道。我对 JavaScript 解释器/引擎在方法完成后释放内存的方式不是很熟悉。有没有一种对垃圾收集器更友好的方式来标记和丢弃(假设 JavaScript 有某种 GC 处理程序)? PS。我意识到 3 个子例程太小,无法真正衡量显着差异,但是如果这些方法被迭代数百次,并且某些任务比其他任务更昂贵(在我的情况下,我正在编写一些 JSFL 脚本来自动化 Flash PNG 导出),技术 #1 听起来更有效。【参考方案2】:

关于激活对象的信息,请参考http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/#more-546

但是,这不是优化级别的问题,因为您列出的问题是 EXTREME 预优化的示例,您的时间不值得这种类型的投资。实际上,在您上面列出的示例中,当您单独查看激活对象时几乎没有节省。

不过,为了正确使用,我会尽可能地封装。如果一个函数不必进入全局作用域,并且可以存在于另一个函数的作用域内,那么这就是它应该被声明的地方。

例如,为了更好地确定范围。


var f2 = function() 


var f1 = function() 
  f2()


// is not as nice as:

var f1 = function() 
  var f2 = function()

  f2()


// or even better.. 

var f1 = function() 
  function() 
  ()  ; execute


【讨论】:

【参考方案3】:

责任分离:

private function myFunc1(): void




private function myFunc2(): void




private function myFunc3(): void




private function doAllFunc(): void

     myFunc1();
     myFunc2();
     myFunc3();

【讨论】:

Gary,您确实意识到您正在回答一个 Javascript 问题,对吧?这看起来像 C/C++,而不是 Javascript。 同意,但那是什么语言? @RobertK - 哦,拜托。 jbabey 这是 Pierre(提问者)非常熟悉的 ActionScript,因为它是他的主要语言。 问题是询问 javascript 的性能,而不是如何最好地用不同的语言编写他的任意示例。 投票点不会转换成美元是件好事。一些用户过于重视声誉积分。感谢 Gary,责任分离 是一个值得考虑的好方面。听起来也很有意义:易于阅读和理解的代码 = 易于执行的代码。 (但显然,它可能不是在所有情况下都是最快的!)

以上是关于leaflet-draw直接调用方法激活的主要内容,如果未能解决你的问题,请参考以下文章

Durandal Compose:激活方法并不总是被调用

java中在同一类中普通方法可以直接调用普通方法和静态方法吗?

从函数中退出以减少激活对象比递归或调用嵌套函数更好吗?

用java实现邮箱的验证以及激活

Unity脚本生命周期

Unity脚本生命周期