在下面的代码中,为什么返回列出了两个方法(增量和打印)?你为什么不能只使用return counter++
?此外,返回console.log
?
function create() {
var counter = 0;
return {
increment: function() {
counter++;
},
print: function() {
console.log(counter);
}
}
}
谢谢!
答案 0 :(得分:6)
这返回的内容或多或少是一个Counter,如果我们重命名最顶层的函数,它应该更有意义。
那它做了什么?让我们添加一些评论
function Counter() { // a function, nothing special here
var counter = 0; // a variable that's local to the function Counter
return { // return an object literal {}
// which has a property named 'increment'
increment: function() { // that's a function AND a closure
counter++; // and therefore still has access to the variable 'counter' inside of Counter
},
print: function() { // another function
console.log(counter); // this logs to the console in most web browser
// the console object was introduces by Firebug
// and effort is made being to standardize it
}
}
}
使用示例:
var a = Counter(); // you don't need the new keyword here sinc in this case
// there's no difference because the implicit return overwrites
// the normal constructor behavior of returning 'this'
a.increment();
a.print(); // 1
var b = Counter();
b.print(); // 0
请注意,函数内部的变量counter
无法从外部访问,因此它是只读,这种效果只能通过使用closure来实现。
答案 1 :(得分:5)
此代码返回一个包含两个方法的对象。
它使用一种称为对象文字的功能:
var sampleObject = { someProperty: 3, otherProperty: "Hi there!" };
在这种情况下,属性是函数文字。
答案 2 :(得分:4)
create
函数返回一个包含两个方法的对象 - increment
和print
。
每次调用create
函数时,都会返回一个新对象。这意味着您可以同时拥有多个“计数器”。
var counter1 = create();
var counter2 = create();
counter1.increment();
counter1.print(); // prints 1
counter2.print(); // prints 0
顺便说一句,counter
函数的局部变量create
通过闭包绑定到increment
和print
方法。在这里阅读有关闭包的内容:http://jibbering.com/faq/notes/closures/
答案 3 :(得分:2)
您建议的代码:
function create() {
var counter = 0;
return counter++;
}
会有不同的效果。那将返回0,然后递增counter
(这将超出范围)。
实际代码返回一个对象(使用对象文字创建,如SLaks所述)。该对象有两种方法increment
和print
。递增方法递增counter
(它不返回它)。 print
使用console.log
打印出来。
这样做的原因是counter
关闭了对象文字的两个方法。这大致意味着它保持活着,并被添加到这些方法的范围中。闭包是JavaScript的常用和重要特性。
答案 4 :(得分:0)
跟随返回时的增量运算符++
基本上是追溯性的。因此,如果您的变量值为5,然后按++
返回,则返回5。
console.log()
通常用于调试事物。它将计数器的值输出到控制台。