考虑如下场景:假如我们需要在界面上画一个圆,初始的时候界面是空白的;当鼠标移动的时候,圆需要跟随鼠标移动,鼠标的当前位置就是圆心。我们的实现方案是:如果界面上还没有画圆,那么就新创建一个;如果已经存在,就直接更新其位置。这样能够避免先销毁,后创建的开销。
var circle = null; function drawCircle(position) { if(circle == null) { circle = GUI.Create(position);//创建1个圆 } else { circle.updatePositon(position);//更新圆的位置 } }
这段代码没有什么问题,除了引入了全局变量circle,而实际上circle只会在drawCircle()函数中使用。也就说为了实现if-else的判断,我们不得不使用全局变量。有没有什么方式能够让函数拥有记忆功能,能够记住之前是否创建了圆。这样的话,我们就不用使用全局变量了。
var drawCircle = function(position) { var circle = null; function innerFunc(position) { if(circle == null) { circle = GUI.Create(position); } else { circle.updatePositon(position); } } return innerFunc; }();
这段代码能够正确的实现需要的功能,而且不会引入没有必要的全局变量。
var drawCircle = function(position) { }();
这段代码会定义1个作用域,大括号内部定义的变量和函数,对于外部都是不可见的。而且大括号内部的代码会立刻执行,代码 之前完之后将innerFunc赋值给drawCircle函数。这样的话,就能够缩小变量的作用域。
时间: 2024-10-14 11:40:33