一般JavaScript语法问题

时间:2010-12-26 01:26:43

标签: javascript syntax

在下面的代码中,为什么返回列出了两个方法(增量和打印)?你为什么不能只使用return counter++?此外,返回console.log

意味着什么?
function create() {
  var counter = 0;
  return {
    increment: function() {
      counter++;
    },
    print: function() {
      console.log(counter);
    }
  }
}

谢谢!

5 个答案:

答案 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函数返回一个包含两个方法的对象 - incrementprint

每次调用create函数时,都会返回一个新对象。这意味着您可以同时拥有多个“计数器”。

var counter1 = create();
var counter2 = create();

counter1.increment();
counter1.print(); // prints 1

counter2.print(); // prints 0

顺便说一句,counter函数的局部变量create通过闭包绑定到incrementprint方法。在这里阅读有关闭包的内容:http://jibbering.com/faq/notes/closures/

答案 3 :(得分:2)

您建议的代码:

function create() {
  var counter = 0;
  return counter++;
}

会有不同的效果。那将返回0,然后递增counter(这将超出范围)。

实际代码返回一个对象(使用对象文字创建,如SLaks所述)。该对象有两种方法incrementprint。递增方法递增counter(它不返回它)。 print使用console.log打印出来。

这样做的原因是counter关闭了对象文字的两个方法。这大致意味着它保持活着,并被添加到这些方法的范围中。闭包是JavaScript的常用和重要特性。

答案 4 :(得分:0)

跟随返回时的增量运算符++基本上是追溯性的。因此,如果您的变量值为5,然后按++返回,则返回5。

console.log()通常用于调试事物。它将计数器的值输出到控制台。