首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"var cc = cc = cc || {};“行在Cocos2D中有什么作用?

"var cc = cc = cc || {};“行在Cocos2D中有什么作用?
EN

Stack Overflow用户
提问于 2013-03-14 17:23:04
回答 3查看 654关注 0票数 4

我试着找出使用这行代码的原因

代码语言:javascript
复制
var cc = cc = cc || {};

在Cocos2D JavaScript库中,例如在this place中,但我找不到任何合理的理由。单次赋值就设置而言,默认值可以,但双重赋值呢?有人知道这是什么原因吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-14 18:24:31

这个问题一直困扰着我,所以我做了一个剧本并做了一些测试,下面是我的发现。

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

注意,出于示例目的,我将使用实际值而不是空对象。

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

代码语言:javascript
复制
var cc = cc || 1;

这将创建一个名为cc的新变量,并提供现有(在相同作用域内)变量的值或1的默认值。此方法不会更改原始变量,尽管在实践中它似乎会有更改的效果,因为您不能随后引用原始变量,因为它具有相同的名称。

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

代码语言:javascript
复制
var aa;
alert(aa);
var cc = aa || 1;
alert(aa);
alert(cc);

(Example)在这里您可以看到aa从不更改。

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

代码语言:javascript
复制
var cc = cc = cc || 1;

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

代码语言:javascript
复制
var aa;
alert(aa);
var cc = aa = aa || 1;
alert(aa);
alert(cc);

(Example)这一次,我们可以看到aa确实发生了更改。

总而言之,您可能永远看不到使用一个变量比另一个变量(具有相同的变量名)有任何影响,但我很好奇,如果可以在赋值之前在某个地方引用原始变量,那么会发生什么影响,因此选择使用哪个变量实际上会产生影响。我会看看我是否能找到一些实际的东西来证明这一点。

票数 1
EN

Stack Overflow用户

发布于 2013-03-14 17:31:52

代码相当于以下代码:

代码语言:javascript
复制
var cc;
cc = cc || {};
cc = cc;

这显然是个错误。

更新。我对这个话题做了更多的研究,这是一件有趣的事情:

无论何时使用var关键字,它都会在当前作用域中创建一个新变量,除非它已经存在于当前作用域中的。基本上是这样的代码:

代码语言:javascript
复制
var cc = 1;
function test() {
    var cc = cc || {};
    return cc;
}
test();

将始终生成{},无论cc (在全局范围内)的初始值是什么。特别是这段代码:

代码语言:javascript
复制
var cc = [expression];

等同于:

代码语言:javascript
复制
var cc;
cc = [expression];

尽管只有在当前作用域中不存在 cc时,var cc;才会创建新变量

更新2.哪个操作优先是令人困惑的,因为在OP的代码中,这两个=符号实际上并不相同。第一个表示变量声明,因为在它之前有一个var关键字。第二个是赋值。怪不得

代码语言:javascript
复制
var x = y = z;

等同于

代码语言:javascript
复制
var x;
y = z;
x = z;

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

代码语言:javascript
复制
x = y = z;

等同于

代码语言:javascript
复制
y = z;
x = z;

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

结论:左侧的变量声明总是在右侧求值和将右侧赋值给左侧之前执行。

票数 2
EN

Stack Overflow用户

发布于 2013-04-22 12:59:17

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

这个表达式失败的原因是在赋值之前声明的变量被设置为undefined。由于此行代码尝试分配一个与其自身同名的变量,并且由于JavaScript首先计算内部作用域变量,因此cc在赋值期间将始终解析为其未定义的内部自身,这将否定逻辑计算并返回{}

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

代码语言:javascript
复制
var cc;                 //cc is set to 'undefined'

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

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

cc = {}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15405362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档