什么是“var cc = cc = cc || {};”在Cocos2D做线?

时间:2013-03-14 09:23:04

标签: javascript cocos2d-iphone

我试图找到使用这行代码的原因

var cc = cc = cc || {};

在Cocos2D JavaScript库中,例如在this地方,但我找不到任何合理的理由。在设置方面单一分配一个默认值就可以了但是双重赋值?有人知道原因吗?

3 个答案:

答案 0 :(得分:2)

代码等同于以下内容:

var cc;
cc = cc || {};
cc = cc;

这显然是个错误。

更新。我对此主题进行了更多研究,这是一件有趣的事情:

每当您使用var关键字时,它会在当前范围内创建一个新变量,除非它已在当前范围中存在。基本上这段代码:

var cc = 1;
function test() {
    var cc = cc || {};
    return cc;
}
test();
无论{}(在全局范围内)的初始值是什么,

总是会生成cc。特别是这段代码:

var cc = [expression];

相当于:

var cc;
cc = [expression];

虽然var cc;仅在当前范围内不存在 cc时才会创建新变量

UPDATE 2。优先考虑的操作令人困惑,因为在OP的代码中,=个符号实际上并不相同。第一个表示变量声明,因为它之前有一个var关键字。第二个是作业。这就是为什么

var x = y = z;

相当于

var x;
y = z;
x = z;

(请注意,var关键字仅适用于x

x = y = z;

相当于

y = z;
x = z;

(请注意,操作y=z会返回z,这并不重要(显然可能是y),但值得注意)

结论:左侧的变量声明始终出现在评估右侧并将右侧分配到左侧之前。

答案 1 :(得分:1)

这个一直让我讨厌,所以我有一个游戏并做了一些测试,这是我的发现。

我将展示两个不同的脚本,产生两个不同的结果,从而解释为什么有人可能会使用一个而不是另一个。然而,使用其中任何一个的原因都取决于编码器,并且将基于他们想要发生的效果。

注意,例如,我将使用实际值而不是空对象。

通常,您可能希望看到以下示例正在使用中:

var cc = cc || 1;

这将创建一个名为cc的新变量,并提供现有(在同一范围内)变量的值或默认值1。这个方法不会改变原始变量,虽然在实践中它看起来会有变化的效果,因为它不能随后引用原始变量,因为它具有相同的名称。

可以使用不同的变量名来测试,例如:

var aa;
alert(aa);
var cc = aa || 1;
alert(aa);
alert(cc);

Example) 在这里,您可以看到aa永远不会改变。

接下来我们来看看有问题的代码:

var cc = cc = cc || 1;

这实际上会改变原始变量并创建一个新的本地变量。同样,当变量具有相同名称时,不容易看到效果。但是,如果我们进行与上面相同的名称更改,我们可以看到真正的效果:

var aa;
alert(aa);
var cc = aa = aa || 1;
alert(aa);
alert(cc);

Example) 这次我们可以看到aa确实发生了变化。

总之,你可能永远不会看到使用一个相对于另一个(使用相同的变量名称)的任何效果,但我很好奇如果在分配之前可以在某处引用原始文件会发生什么样的效果,因此选择使用哪个实际上会产生影响。我会看看能不能找到一些可以表明这一点的行动。

答案 2 :(得分:0)

这段代码显然是个错误。作者想到的可能是将全局和内部范围变量设置为相同的值,但此表达式将始终失败。它不仅无法设置外部变量,而且它总是返回{}

此表达式失败的原因是在赋值之前声明的变量设置为 undefined 。由于此行代码尝试分配与其自身具有相同名称的变量,并且由于JavaScript首先评估内部范围变量,因此cc将始终在分配时解析为其 undefined 内部自我,否定逻辑评估并返回{}

在代码中查看它的另一种方法:

var cc;                 //cc is set to 'undefined'

cc = cc || {};          //which becomes equivalent to:

cc = undefined || {};   //which finally evaluates to:

cc = {}