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*");
            }
        },
    }
}
有帮助吗?

解决方案

var gameOfLife = function() { }

是一个 函数表达式, ,而

function gameOfLife() { }

是一个 函数声明.

引用Juriy'kangax'Zaytsev关于 函数表达式vs.函数声明:

有一个微妙的区别 声明的行为和 表情。

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

另一个 功能的重要特征 声明就是声明它们 有条件的是非标准化的和 在不同的环境中变化。你永远不应该依赖函数 有条件地声明和使用 函数表达式代替。

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

这些条件定义函数的一般用例是在不具有对较新函数的本机支持(在以前的ECMAScript/JavaScript版本中不可用)的浏览器中增强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,试图给出函数被分配到的变量的名称,但是由于调试器必须通过实时解析脚本内容来猜测这一点,这可能太困难了(这会导致一个 (?)() 示,而不是函数名)甚至是错误的。

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

其他提示

  1. 在JavaScript中,函数是 第一类对象.您可以将它们存储在对象(变量)中,并将它们作为参数传递给函数。每个函数实际上都是一个 Function 对象。

  2. gol 是一个对象,它正在使用 对象字面量 符号。


1)在下面的代码中,使gameOfLive成为变量而不仅仅是"函数gameOfLife()"背后的推理是什么?


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

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


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


语法称为compact object notation。这里有趣的是,"compact"对象是在函数内部声明的。在这样的函数中声明对象非常有用,因为您可以使用它来构建具有(有效)私有成员的javascript对象。

关键是要记住javascript中的函数和对象 都是一样的东西.因此,全 gameOfLife() 函数实际上是一个对象定义。此外, gol 声明为 gameOfLife 很可能是定义私有成员的常用技术的一部分。该 gameOfLife() 函数/对象将返回this gol 对象。所有其他在 gameOfLife() 函数/对象有效地成为返回的私有成员 gol 实例,而在 gol 对象本身是公开的。他们真正想要做的是最终编写这样的代码:

var game = new gameOfLife();

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


将函数放在变量中可以让您稍后再来并用另一个函数替换它,将该函数透明地替换为代码的其余部分。当您在表单小部件上指定"onClick="时,这与您正在做的事情相同。

当然:解释语法:

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

gameOfLife()

gol是一个对象(散列),而"init"是上述语法的另一个例子,除了直接放入"gol"散列中的"init"键。所以 那个 函数反过来可以被调用:

gol["init"](w,h)

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top