Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数内部调用函数_Javascript_Oop_Coding Style_Code Reuse - Fatal编程技术网

Javascript 在函数内部调用函数

Javascript 在函数内部调用函数,javascript,oop,coding-style,code-reuse,Javascript,Oop,Coding Style,Code Reuse,当我编写代码时,我会尝试将所有内容划分为函数(方法,如果您愿意的话)。函数X填充X,Y填充凝灰岩Y和不类似方法X填充X,Y和Z!这给了我更多可重用的代码。我喜欢。:) 让我们看看这段代码: var user = { users: [], userCount: 0, addUser: function(user) { (this.users).push(user); }, incrementCount: function() { ++this.userCount

当我编写代码时,我会尝试将所有内容划分为函数(方法,如果您愿意的话)。函数X填充X,Y填充凝灰岩Y和类似方法X填充X,Y和Z!这给了我更多可重用的代码。我喜欢。:)

让我们看看这段代码:

var user = {
  users: [],
  userCount: 0,
  addUser: function(user) {
    (this.users).push(user);
  },
  incrementCount: function() {
    ++this.userCount;
  }
}

var user = { // 2nd example.
  users: [],
  userCount: 0,
  addUser: function(user) {
    (this.users).push(user);
    ++this.userCount;
  }
}
(它是用JavaScript编写的,但这里的语言不是必需的。)

在我看来,第二个示例对于API用户来说将更容易且更安全。 很容易忘记调用
user.incrementCount()
。你怎么认为?第二个例子是自动完成的

那么如何找到平衡呢?在函数内部调用函数的最佳实践是什么

谢谢你阅读这篇文章

编辑

我刚才想到:

var user = {
  users: [],
  userCount: 0,
  addUser: function(user) {
    (this.users).push(user);
    this.incrementCount();
  },
  incrementCount: function() {
    ++this.userCount;
  }
}

在JS中有点不同,因为当使用对象文字符号时,没有一种方法可以使函数真正私有化,但是

这都是关于您希望对象向其使用者公开的API。您希望API的使用者能够在添加用户的同时单独增加计数吗?如果是:

{ addUser: /* snip */, incrementCount: /* snip */ }
否则:

{ addUser: /* snip */, _incrementCount: /* snip */ }
// or just
{ addUser: /* snip */ }
在这种情况下,我强烈建议不要存储任何单独的计数,因为
users
数组已经为您存储了

var user = {
  _users: [],
  addUser: function(user) {
      this._users.push(user);
  },
  getUserCount: function () {
      return this._users.length;
  }
  // and if you need to expose the users array directly,
  , getUsers: function () {
      return this._users;
  }
}

在JS中有点不同,因为当使用对象文字符号时,没有一种方法可以使函数真正私有化,但是

这都是关于您希望对象向其使用者公开的API。您希望API的使用者能够在添加用户的同时单独增加计数吗?如果是:

{ addUser: /* snip */, incrementCount: /* snip */ }
否则:

{ addUser: /* snip */, _incrementCount: /* snip */ }
// or just
{ addUser: /* snip */ }
在这种情况下,我强烈建议不要存储任何单独的计数,因为
users
数组已经为您存储了

var user = {
  _users: [],
  addUser: function(user) {
      this._users.push(user);
  },
  getUserCount: function () {
      return this._users.length;
  }
  // and if you need to expose the users array directly,
  , getUsers: function () {
      return this._users;
  }
}
你说的“函数A做的是A”是对的 但是:一个对数据起作用的函数,从外部隐藏(或多或少),应该对数据执行您想要的操作(例如添加一个用户),并使舒尔保持数据的正确性(例如,如果您有一个用户列表,则增加Usercounter以使舒尔始终正确)。 如果你想让API的用户为你做这件事,那无论如何都是不舒服的

想象一下,你在用户列表中添加了更多功能(例如,告诉用户它已添加到列表中,将用户存储在二叉树中,等等),你必须从功能外部完成所有组织工作,这有什么好处

你说得对,“函数A做A-东西。” 但是:一个对数据起作用的函数,从外部隐藏(或多或少),应该对数据执行您想要的操作(例如添加一个用户),并使舒尔保持数据的正确性(例如,如果您有一个用户列表,则增加Usercounter以使舒尔始终正确)。 如果你想让API的用户为你做这件事,那无论如何都是不舒服的


想象一下,你在用户列表中添加了更多功能(例如,告诉用户它已添加到列表中,将用户存储在二叉树中,等等),你必须从功能外部完成所有组织工作,这有什么好处

就个人而言,我认为你甚至不应该通过API公开这些东西。而且,只要使用
users.length
,就会更容易(至少在JavaScript中)更直观

最后,我认为保持你的界面简单通常是一件好事。抽象是一件好事。如果我正在使用其他人的库,我会非常失望地得知我被期望手动增加该值

更新:

我认为还有一件事值得一提:


通过让您的代码在内部维护状态并保持API的简单,您不仅可以简化用户的生活,而且还可以防止误用(在可能的范围内)。很容易想象有人不正确地使用增量方法,结果会破坏东西。

就个人而言,我认为你甚至不应该通过API公开这些东西。而且,只要使用
users.length
,就会更容易(至少在JavaScript中)更直观

最后,我认为保持你的界面简单通常是一件好事。抽象是一件好事。如果我正在使用其他人的库,我会非常失望地得知我被期望手动增加该值

更新:

我认为还有一件事值得一提:


通过让您的代码在内部维护状态并保持API的简单,您不仅可以简化用户的生活,而且还可以防止误用(在可能的范围内)。很容易想象有人不正确地使用增量方法,结果它会破坏东西。

我知道您只是想让示例代码成为一个简单的示例,但是对于计数或长度变量之类的东西,我想不出为什么我要让它独立于函数设置添加或删除项目的。当使用对象时,您不希望每次添加时都必须调用
add()
increment()
方法,并且您确实不希望在没有其他方法的情况下执行一个操作,否则您的对象将处于无效状态

所以我从来不会用第一种方法,当然你在编辑中添加的方法更糟糕。让函数相互调用没有什么错,但在您的示例中,我希望增量函数是私有的

最好将count变量设置为私有,只允许通过函数检索它,并通过添加/删除函数设置它(尽管当您只需返回
用户时,您甚至不需要count变量。length