2

我是 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() 的对象吗?谢谢

尤塔姆

4

4 回答 4

4

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

但是这个函数也是在闭包中声明的,这意味着它可以拥有这个私有x属性

  • 两个函数都可见和可修改
  • 不能以其他方式读取或修改

与的主要区别

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

就是它

  • x 受创建对象的闭包保护
  • 关于 x 不能有名称冲突,并且全局命名空间不会杂乱无章
于 2012-12-04T09:20:27.127 回答
3

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

于 2012-12-04T09:19:35.070 回答
1

Yo 甚至可以省略foo()after 函数,因为这些属性将如您所见命名,并且这些函数也可以是匿名的,因此: return { var foo: function() {return ++x}, var bar: function() {return --x}, };

所以你有对象的属性是函数。

于 2012-12-04T09:23:41.793 回答
0

该函数baz将变量x设置为 1,然后创建返回一个对象。这个对象有两个字段,一个是being foo,另一个是being bar。关于对象的一件小事是,如果你想访问一个字段,你只需要调用object.fieldname. 我们稍后会详细介绍。

功能foobar非常简单。如果您不确定 ++x 和 --x 在这里做什么,这是一个很好的 Stackoverflow 问题:

C++ 中的递增 - 何时使用 x++ 或 ++x?

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

在函数的末尾closures定义了一个被调用的变量,这是从函数返回的对象。就像我之前说的,为了访问这些字段,你需要做的就是做object.fieldname在这种情况下是closures.foo()or closures.bar()(括号是运行函数所必需的)。

我刚刚对其进行了测试,您的警报显示为 2。我相信原因是它不理解的语法,alert(int,int)所以它只显示第一个警报。

于 2012-12-04T09:30:00.570 回答