Javascript 数组范围问题

标签 javascript arrays html scope

已解决 - 这个示例代码有效,所以我将它与我的非工作代码进行了比较,发现了差异。

在我的代码中,那个不起作用的代码在声明颜色数组时忘记在它之前添加一个“var”。

m_color = [];
m_color[0] = 255;
m_color[1] = 255;
m_color[2] = 255;
m_color[3] = 255;

代替:

var m_color = [];
m_color[0] = 255;
m_color[1] = 255;
m_color[2] = 255;
m_color[3] = 255;

就是这样。没有产生错误,我猜它创建它作为所有粒子共享的全局数组。

谢谢大家的回答。我将使用它们来编写更好的 JavaScript 代码。

旧问题(不再相关)如下:


我对 javascript 数组范围有这个疯狂的问题。

我有一个粒子类:

function ParticleClass()
{
    var m_color = [];
    m_color[0] = 255;
    m_color[1] = 255;
    m_color[2] = 255;
    m_color[3] = 255;

    var m_red = 255;
    var m_green = 255;
    var m_blue = 255;

    this.SetRandomColorRGB = SetRandomColorRGB;
    this.SetRandomColorArray = SetRandomColorArray;
    this.DrawParticleRGB = DrawParticleRGB;
    this.DrawParticleArray = DrawParticleArray;

    function SetRandomColorRGB()
    {
        m_red = Math.floor( Math.random() * 255 );
        m_green = Math.floor( Math.random() * 255 );
        m_blue = Math.floor( Math.random() * 255 );
    }

    function SetRandomColorArray()
    {
        m_color[0] = Math.floor( Math.random() * 255 );
        m_color[1] = Math.floor( Math.random() * 255 );
        m_color[2] = Math.floor( Math.random() * 255 );
    }

    function DrawParticleRGB( ctx )
    {
        // I draw the particle using m_red, m_green and m_blue.
    }

    function DrawParticleArray( ctx )
    {
        // I draw the particle using m_color[0], m_color[1], m_color[2]
    }
}

然后我创建一个 ParticleClass 粒子数组并绘制它们。

如果我创建一堆粒子并尝试在屏幕上绘制它们,SetRandomColorRGB 和 DrawParticleRGB 效果很好。每个粒子都有不同的颜色。

如果我使用 SetRandomColorArray 和 DrawParticleArray,所有粒子都具有相同的颜色。每次创建新粒子时,所有粒子都会更改为 SetRandomColorArray 选取的最后一种颜色。

在我看来,数组共享内存,而其他变量则不共享。这是真的?这是 Javascript 的怪癖吗?还有其他事情吗?

谢谢。

最佳答案

变量的范围在函数 ParticleClass() 内。因此,在此空间中定义的函数中的变量将与其父级共享作用域。

这就是为什么有时您会在 Javascript 中看到这种模式 -

var self = this;
$('.someClass').each(function(i) {
   // function is defined as a closure
   // but it shares its scope with its parent so it can see self and access the parent's  
   // pointer to this.
});

为什么不使用原型(prototype)来定义函数...

例如..

var myClass = function() {
  this.stuff = 1;
}
myClass.prototype.myFunc = function() {
  // Do Something..
  this.stuff += 5;
}

// Then create instances of your class with
var i = new MyClass();

这将为您提供所需的命名空间...

这是一个例子:http://jsfiddle.net/RvCgJ/

关于Javascript 数组范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704778/

相关文章:

javascript - 每次单击同一个按钮如何播放不同的视频?

html - 媒体查询斗争

java - Rhino API - 使用 org.mozilla.javascript.Context 访问 js 方法?

c++ - 如何为 std::array 的列表初始化构造函数编写包装器?

ios - NSMutableArray UIButton 按下历史记录

c# - C#-如何按顺时针顺序(tl,tr,br,bl)对4点列表进行排序,以用于opencv getPerspective?

javascript - jQuery-animate() 停不下来?

javascript - 订阅两个可观察对象,即在另一个可观察 HTTP 中可观察

javascript - 扩展 HTMLElement

javascript - 如何在 Promise 中编码 "try again"?