Javascript 是否可以在返回中声明函数?

标签 javascript encapsulation

根据这篇文章(https://www.intertech.com/Blog/encapsulation-in-javascript/),下面的代码是JS封装的一个例子。它所做的基本上是限制修改变量 fullName 的可能性,因此只有当新的 fullName 没有数字时才可以更改。

  var person = (function () {

  var fullName = "Jason Shapiro";
  var reg = new RegExp(/\d+/);

  return {
    setFullName : function (newValue) {
      if( reg.test(newValue) ) {
        alert("Invalid Name");
      }
      else {
        fullName = newValue;
      }
    },
    getFullName : function () {
     return fullName; 
    }
  }; // end of the return
}());

alert(person.getFullName());  // Jim White is printed again.

person.setFullName( 42 ); // Invalid Name; the name is not changed

这一切对我来说似乎都是合乎逻辑的,但我无法理解的是,如果这些函数在返回 block 中,他如何调用 getFullName 或 setFullName。

最佳答案

这个例子并不奇怪;我们只需要把它分解。

  1. 正在声明一个名为 person 的变量。

  2. 人是什么对象?好吧,这是对零参数调用匿名函数的结果。

  3. 调用该匿名函数时,它会返回一个对象。

  4. 函数返回的对象有两个属性,setFullNamegetFullName

  5. 函数返回的对象是变量person的值。因此 person.getFullNameperson.setFullName 都是有效的表达式。

我认为混淆点可能是您认为 getFullNamesetFullName 的范围仅限于 return 表达式内的代码。然而,JavaScript 是一种非常动态的语言。可以随时向对象添加和删除属性。 JavaScript 解释器在运行时而不是编译时检查属性是否存在。

关于Javascript 是否可以在返回中声明函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48480757/

相关文章:

java - 为什么我的数组被覆盖了java

javascript - 在表格内设置分页符

javascript - equal 在 javascript 中不起作用

javascript - 唯一的元素 ID,即使元素没有

java - 为什么可以访问嵌套静态类的成员?

java - 在 Java 中,使对象的成员公开可用是不是一个坏主意?

JavaScript 正则表达式 - 替换字符 X 和字符 Y 之间除单词字符之外的所有单词字符

javascript - JS 获取动画元素的当前位置

java - gradle:封装自定义dsl的最佳方法

java - 返回并打印字段值或仅通过类方法打印值?