1

我是一名新手程序员,他从 Stoyan Stefanovs 面向对象的 JavaScript Book 中获得了以下功能。他说如果你接下来调用 3 次,它会输出“a”和“b”,然后是“c”。当我在萤火虫控制台中尝试它时,它一直给我“a”,所以这是一个问题(a),即是否有关于萤火虫的东西可以解释我的结果?

接下来,我尝试在 jsfiddle.net 中运行它,但它不会输出任何内容。http://jsfiddle.net/mjmitche/SkSMm/

m sure I做错了什么,但是什么?如果可以请解释一下。注意,我做了 next(); 得到A,然后我做了next(); 再次得到'a'和next();再次得到'a'。换句话说,柜台不t change or didn记得了。

function setup(x) {
   var i = 0;
   return function () {
        return x[i++];
    };
}

var next = setup(['a','b','c']);

next();
4

4 回答 4

1

JsFiddle 不像控制台,它没有输出返回值的窗口。代码的结果是一个网页,显示在右下方。

您可以使用该alert方法显示值:

alert(next());

http://jsfiddle.net/SkSMm/4/

如您所见,调用next三次实际上会输出数组中的三个值。该setup函数返回一个委托给在函数中创建的匿名函数。由于该匿名函数使用自身外部的变量,但这些变量是周围函数的本地变量,因此为该函数创建了一个闭包。闭包将包含ix变量。由于闭包属于委托,因此它将从一个函数调用到下一个函数调用,并保留其变量的值。

您可以只使用全局变量来做类似的事情:

var x = ['a','b','c'];
var i = 0;

function next() {
  return x[i++];
}

alert(next());
alert(next());
alert(next());

由于变量是在函数外部声明的,因此它们将在函数调用之间继续存在。

使用全局变量的缺点是,如果变量没有被赋予非常独特的名称,一个脚本很容易与另一个脚本发生冲突。如果您使用闭包,则不会有一个脚本的变量与另一个脚本的变量发生冲突的风险。

于 2011-04-15T05:26:10.633 回答
1

这是显示它有效的 jsfiddle 链接:

http://jsfiddle.net/ZnZTk/

于 2011-04-15T05:19:43.920 回答
0

你做错了: 在此处输入图像描述

和 jsfiddle:http: //jsfiddle.net/ZHgW2/

于 2011-04-15T05:14:53.600 回答
0

这是一个简洁的演示,它利用了导入的say函数并依赖于一个按钮:

http://jsfiddle.net/entropo/wxTqR/

这是在不依赖日志或警报的情况下测试脚本的好方法。

say函数来自 jQuery in Action。摘抄:

在这个函数中,我们使用了一个小型实用函数 say() C 的服务,我们使用它来向页面上动态创建的元素发送文本消息,我们将其称为“控制台”。这个函数是在导入的支持脚本文件 (jqia2.support.js) 中声明的,它将为我们省去使用烦人和破坏性警报来指示我们页面上何时发生事情的麻烦。我们将在本书其余部分的许多示例中使用这个方便的函数。
于 2011-04-15T05:29:15.840 回答