我试着找出使用这行代码的原因
var cc = cc = cc || {};在Cocos2D JavaScript库中,例如在this place中,但我找不到任何合理的理由。单次赋值就设置而言,默认值可以,但双重赋值呢?有人知道这是什么原因吗?
发布于 2013-03-14 18:24:31
这个问题一直困扰着我,所以我做了一个剧本并做了一些测试,下面是我的发现。
我将展示两段不同的脚本,它们产生两种不同的结果,从而解释为什么有人可能会使用其中一种而不是另一种。然而,使用这两种方法的原因都取决于编码人员,并将基于他们想要发生的效果。
注意,出于示例目的,我将使用实际值而不是空对象。
通常,您可能希望在使用中看到以下示例:
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确实发生了更改。
总而言之,您可能永远看不到使用一个变量比另一个变量(具有相同的变量名)有任何影响,但我很好奇,如果可以在赋值之前在某个地方引用原始变量,那么会发生什么影响,因此选择使用哪个变量实际上会产生影响。我会看看我是否能找到一些实际的东西来证明这一点。
发布于 2013-03-14 17:31:52
代码相当于以下代码:
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];尽管只有在当前作用域中不存在 cc时,var cc;才会创建新变量。
更新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 ),但它值得注意)
结论:左侧的变量声明总是在右侧求值和将右侧赋值给左侧之前执行。
发布于 2013-04-22 12:59:17
这段代码显然是个错误。作者的想法可能是将全局和内部作用域变量设置为相同的值,但这个表达式总是会失败。它不仅设置外部变量失败,而且总是返回{}。
这个表达式失败的原因是在赋值之前声明的变量被设置为undefined。由于此行代码尝试分配一个与其自身同名的变量,并且由于JavaScript首先计算内部作用域变量,因此cc在赋值期间将始终解析为其未定义的内部自身,这将否定逻辑计算并返回{}。
在代码中查看它的另一种方式:
var cc; //cc is set to 'undefined'
cc = cc || {}; //which becomes equivalent to:
cc = undefined || {}; //which finally evaluates to:
cc = {}https://stackoverflow.com/questions/15405362
复制相似问题