我是JS的新手,遇到了几个新的问题。例如,我看到了这段代码:
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
答案 0 :(得分:4)
是的,它“只是一个具有两个函数foo()和bar()”的对象。
但是这个函数也在closure中声明,这意味着它可以拥有这个私有属性x
与
的主要区别var x = 1;
var closures = {
foo: function() {return ++x},
bar: function() {return --x},
};
就是那个
答案 1 :(得分:3)
函数baz
返回一个具有两个属性(foo
和bar
)的对象。这两个属性的值是函数(两者都修改并返回相同x
变量的值)。
答案 2 :(得分:1)
Yo甚至可以省略foo()
之后的函数,因为这些属性将按照您的名字命名,并且这些函数也可以是匿名的,因此:
return {
var foo: function() {return ++x},
var bar: function() {return --x},
};
所以你有一个属性为对象的对象。
答案 3 :(得分:0)
函数baz
将变量x
设置为1,然后创建返回对象。该对象有两个字段,一个是foo
,另一个是bar
。关于对象的一点点快速的事情是,如果你想访问一个字段,你只需要调用object.fieldname
。我们稍后会详细介绍。
函数foo
和bar
非常简单。如果你不确定++ x和--x在这里做了什么是一个很好的Stackoverflow问题:
Incrementing in C++ - When to use x++ or ++x?
基本上它说它将执行语句然后递增或递减x。因为它返回x我相信它将返回1,然后递增或递减x。
在函数的末尾定义了一个名为closures
的变量,这是从函数返回的对象。就像我之前说的那样,为了访问这些字段,您需要做的就是object.fieldname
,在这种情况下,closures.foo()
或closures.bar()
(括号是运行功能)。
我刚测试了它,你的警报显示2.我相信原因是它不理解alert(int,int)
的语法,所以它只显示第一个警报。