8

1)在下面的代码中,制作gameOfLive变量而不是仅仅的原因是function gameOfLife()什么?

2) 是什么gol?它看起来像一个数组,但我不熟悉语法或它的名称。

我正在学习http://sixfoottallrabbit.co.uk/gameoflife/

if (!window.gameOfLife) var gameOfLife = function() {

    var gol = {
        body: null,
        canvas: null,
        context: null,
        grids: [],
        mouseDown: false,
        interval: null,
        control: null,
        moving: -1,
        clickToGive: -1,
        table: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
        tableBack: null,

        init: function(width, height) {
            gol.body = document.getElementsByTagName('body')[0];
            gol.canvas = document.createElement('canvas');
            if (gol.canvas.getContext) {
                gol.context = gol.canvas.getContext('2d');
                document.getElementById('content').appendChild(gol.canvas);
                gol.canvas.width = width;
                gol.canvas.height = height;
                gol.canvas.style.marginLeft = "8px";

                gol.control = document.getElementById('gridcontrol');

                gol.canvas.onmousedown = gol.onMouseDown;
                gol.canvas.onmousemove = gol.onMouseMove;
                gol.canvas.onmouseup = gol.onMouseUp;

                gol.addGrid(48,32,100,44,8);

                gol.refreshAll();
                gol.refreshGridSelect(-1);
                gol.getOptions(-1);

                gol.genTableBack();
            } else {
                alert("Canvas not supported by your browser. Why don't you try Firefox or Chrome? For now, you can have a hug. *hug*");
            }
        },
    }
}
4

7 回答 7

15
var gameOfLife = function() { }

是一个函数表达式,而

function gameOfLife() { }

是一个函数声明

引用 Juriy 'kangax' Zaytsev 关于函数表达式与函数声明

声明和表达式的行为存在细微差别。

首先,函数声明在任何其他表达式之前被解析和评估。即使声明在源中位于最后,它也将首先评估 范围中包含的任何其他表达式。[…]

函数声明的另一个重要特征是有条件地声明它们是非标准化的,并且在不同的环境中有所不同。您永远不应依赖有条件声明的函数,而应使用函数表达式。

在这种情况下,正如 Joel Coehoorn 在评论中提到的那样,gameOfLife是有条件地定义的,因此需要使用函数表达式。

这些条件定义函数的一般用例是增强浏览器中的 JavaScript 功能,这些浏览器不支持新函数(在以前的 ECMAScript/JavaScript 版本中不可用)。您不想使用函数声明来执行此操作,因为它们无论如何都会覆盖本机功能,这很可能不是您想要的(考虑到速度等)。一个简短的例子

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function(item, from) {
        /* implement Array.indexOf functionality,
           but only if there's no native support */
    }
}

函数表达式的一个主要缺点是您实际上将匿名函数分配给变量。这会使调试变得更加困难,因为当脚本执行停止时(例如,在您设置的断点上),函数名称通常是未知的。一些 JavaScript 调试器,比如 Firebug,会尝试给出分配给函数的变量的名称,但是由于调试器必须通过动态解析脚本内容来猜测这一点,这可能太难了(这会导致(?)()显示,而不是函数名)甚至是错误的。

(例如,在页面上阅读,虽然它的内容并不完全适合初学者)

于 2010-07-09T00:18:07.847 回答
15
  1. 在 JavaScript 中,函数是第一类对象。您可以将它们存储在对象(变量)中并将它们作为参数传递给函数。每个函数实际上都是一个Function对象。

  2. gol是一个对象,它使用对象字面量表示法进行初始化。

于 2010-07-08T21:49:10.987 回答
4

1) 在以下代码中,将 gameOfLive 设为变量而不仅仅是“函数 gameOfLife()”的原因是什么?


在全局级别定义的变量是窗口对象的成员。因此,通过将其设为变量,您可以使用语法window.gameOfLife(). 这也是他们可以if (!window.gameOfLife)在代码段开头使用检查的原因。

但这并不能真正解释他们为什么选择这样做,而函数声明也会做同样的事情。 Marcel Korpel 的回答更好地解释了这两个选项的“原因”。


2)什么是黄金?它看起来像一个数组,但我不熟悉语法或它的名称。


该语法称为紧凑对象表示法。有趣的是,“紧凑”对象是在函数内部声明的。在这样的函数中声明对象很有用,因为您可以使用它来构建具有(有效)私有成员的 javascript 对象。

关键是要记住 javascript中的函数和对象是一回事。因此,完整的gameOfLife()功能实际上是一个对象定义。此外,gol声明为成员的对象gameOfLife很可能是定义私有成员的常用技术的一部分。gameOfLife()函数/对象将返回此对象gol。在函数/对象内声明的所有其他项gameOfLife()实际上成为返回gol实例的私有成员,而在gol对象本身内声明的所有内容都是公共的。他们真正想做的是最终编写如下代码:

var game = new gameOfLife();

现在,当他们这样做时,游戏变量将保存一个gol对象。此对象中的方法仍然可以访问完整gameOfLife()函数中声明的项目,但其他代码不能(至少,不那么容易)。因此,这些项目实际上是私有的。对象本身中的项目gol仍然是公开的。因此,您拥有一个具有私有和公共成员的对象,用于适当的封装/信息隐藏,就像您使用其他面向对象的语言构建一样。


于 2010-07-08T22:27:56.980 回答
2

将函数放入变量中可以让您稍后使用另一个函数替换它,从而将函数透明地替换为代码的其余部分。这与您在表单小部件上指定“onClick=”时所做的相同。

于 2010-07-08T21:51:17.290 回答
1

确定:解释语法:

函数是 javascript 中的第一类对象,因此您可以将函数放入变量中。因此,这段代码的主要部分实际上是一个存储在 var gameOfLife 中的函数定义,以后可以通过调用来使用:

gameOfLife()

gol 是一个对象(散列),“init”是上述语法的另一个例子,除了直接放入“gol”散列中的“init”键。这样函数又可以通过以下方式调用:

gol["init"](w,h)
于 2010-07-08T21:50:05.813 回答
1

根据此页面gameOfLife以他们的方式声明与以您的方式声明没有什么不同。他们定义的方式gol使其成为对象(或者您可以将其视为关联数组)。数组的类似快捷方式是使用方括号而不是花括号。

于 2010-07-08T21:50:07.430 回答
0

如果您希望函数成为对象的属性,则将函数视为变量可能很有用。(见:http ://www.permadi.com/tutorial/jsFunc/index.html )

我相信 gol 是一个以名称/值对描述的 JavaScript 对象——很像 JSON 格式。(见:http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_)

于 2010-07-08T21:48:47.620 回答