2012-12-04 52 views
2

我是JS的新手,遇到了几个新的问题。例如我看到这一段代码:无法理解JavaScript函数返回

function baz() { 
    var x = 1; 
    return { 
     foo: function foo() {return ++x}, 
     bar: function foo() {return --x}, 
    }; 
} 

var closures = baz(); 
alert(closures.foo(),closures.bar()); 

它应该显示出共享变量。我的问题是 - 正在返回什么?

它只是一个具有两个函数foo()和bar()的对象吗? 由于

Yotam

回答

4

是的,它“只是一个具有两个函数foo()和bar()”的对象。

不过这个功能在closure还宣布,这意味着它可以有这样的私人财产x

  • 是由两个功能可见和可修改
  • 不能读取或修改,否则

var x = 1; 
var closures = { 
    foo: function() {return ++x}, 
    bar: function() {return --x}, 
}; 
的主要区别

  • x由封闭创建对象的保护
  • 可以有作为X没有名字冲突,全局命名空间不凌乱
3

baz具有两个属性(foobar)返回一个对象的功能。这两个属性的值是函数(两者都修改并返回相同变量的值)。

1

呦甚至可以省略foo()函数之后,因为那些属性将按照您所看到的名称命名,并且这些函数也可以是匿名的: return { var foo: function() {return ++x}, var bar: function() {return --x}, };

因此,您有p性能是功能。

0

函数baz将变量x设置为1,然后创建返回一个对象。该对象有两个字段,一个是foo,另一个是bar。关于对象的一点快速的事情是,如果你想访问一个领域,你只需要拨打object.fieldname即可。稍后我们会进一步讨论。

功能foobar很简单。如果你不知道什么++ x和--x在这里所做的是一个很好的问题#1:

Incrementing in C++ - When to use x++ or ++x?

基本上跟它它会执行语句,然后递增或递减X。因为它返回x我相信它会返回1,然后递增或递减x。

在定义了一个名为closures变量的函数的末尾,这是从该函数返回的对象。就像我之前说的,为了访问域,所有你需要做的是做object.fieldname在这种情况下将closures.foo()closures.bar()(括号是必要的运行功能)。

我刚刚测试过,你的警报显示2.我相信原因是它不理解alert(int,int)的语法,所以它只显示第一个警报。