我是一名新手程序员,他从Stoyan Stefanovs面向对象的JavaScript Book获得了以下功能。他说如果你接下来三次打电话,它会输出“a”和“b”然后输出“c”。当我在firebug控制台中尝试它时,它一直给我“a”,所以这是一个问题(a),即有什么关于firebug可以解释我的结果吗?
接下来,我尝试在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();
答案 0 :(得分:1)
以下是显示其有效的jsfiddle链接:
答案 1 :(得分:1)
JsFiddle与控制台不同,它没有窗口输出返回值。代码的结果是一个网页,显示在右下角。
您可以使用alert
方法显示值:
alert(next());
如您所见,调用next
三次将实际输出数组中的三个值。 setup
函数返回一个委托给函数中创建的anonumous函数。由于匿名函数本身使用变量,但它们是周围函数的局部变量,因此为函数创建了一个闭包。闭包将包含i
和x
变量。由于闭包属于委托,它将从一个函数调用到下一个函数调用,并保留它的变量值。
你可以使用全局变量做类似的事情:
var x = ['a','b','c'];
var i = 0;
function next() {
return x[i++];
}
alert(next());
alert(next());
alert(next());
当变量在函数外声明时,它们将在函数调用之间存活。
使用全局变量的缺点是,如果变量没有给出非常独特的名称,则一个脚本很容易与另一个脚本发生冲突。如果使用闭包,则不存在一个脚本的变量与另一个脚本的变量冲突的风险。
答案 2 :(得分:0)
你做错了:
并且jsfiddle:http://jsfiddle.net/ZHgW2/
答案 3 :(得分:0)
这是一个利用imported say
function并依赖按钮的简洁演示:
http://jsfiddle.net/entropo/wxTqR/
这是一种在不依赖日志或警报的情况下测试脚本的好方法。
say
函数来自jQuery in Action。摘录:
在这个函数中,我们使用一个小实用函数的服务,比如说()C, 我们用来向页面上动态创建的元素发送文本消息 我们称之为“控制台”。此功能在导入的支持中声明 脚本文件(jqia2.support.js),将为我们省去使用烦人和破坏性警报来指示我们页面上发生什么事情的麻烦。在本书的其余部分中,我们将在许多示例中使用这个方便的函数。