Javascript 为什么会出现这样的错误:未捕获类型错误:无法读取属性';约翰';未定义的

Javascript 为什么会出现这样的错误:未捕获类型错误:无法读取属性';约翰';未定义的,javascript,object,Javascript,Object,我是JavaScript新手,可能没有使用正确的术语,所以请容忍我 我希望在页面上显示以下内容 你好,我叫约翰·史密斯,今年29岁。你好,我叫苏西·阿尔波特,今年24岁 我想知道为什么苏西不能参考约翰的问候方法 <script> var employees = { john: { name: "John Smith", age: 29, job:

我是JavaScript新手,可能没有使用正确的术语,所以请容忍我

我希望在页面上显示以下内容 你好,我叫约翰·史密斯,今年29岁。你好,我叫苏西·阿尔波特,今年24岁

我想知道为什么苏西不能参考约翰的问候方法

<script>
        var employees = {
            john: {
                name: "John Smith",
                age: 29,
                job: "web developer",
                greet: function(){
                    document.write("Hello my name is " + this.name + " and I am " + this.age + " years old. ");
                }
            },
            suzie: {
                name: "Suzie Alport",
                age: 24,
                job: "nursery assistant",
                greet: employees.john.greet
            }
        };
        employees.john.greet();
        employees.suzie.greet();
</script>

var雇员={
约翰:{
姓名:“约翰·史密斯”,
年龄:29,,
工作:“网络开发者”,
问候:函数(){
文档。写下(“你好,我的名字是”+this.name+,我是”+this.age+“岁”);
}
},
苏西:{
姓名:“苏西·阿尔波特”,
年龄:24岁,
职位:“托儿所助理”,
问候:雇员
}
};
employees.john.greet();
employees.suzie.greet();

谢谢

在您创建分配给
suzie
属性的对象时,
employees
未定义的
。在整个表达式完成之前,将对属性初始值设定项进行求值

以下是上述事件发生的顺序:

  • 引擎创建一个名为
    employees
    的变量,其初始值为
    undefined
  • 引擎创建一个空白对象(最终将分配给
    员工
  • 引擎创建另一个空白对象(最终将成为
    john
    属性值)
  • 它评估<代码>“约翰·史密斯”< /C> >并在空白对象上创建一个属性,名为<代码>名称>代码>,赋予该值。
  • 它对
    年龄
    工作
    问候
    重复该过程
  • 它将该对象指定给上面#2中对象的
    john
    属性
  • 它会创建另一个空白对象(变成
    suzie
  • 它计算
    “Suzie Alport”
    ,并在#7中的对象上创建一个名为
    name
    的属性,赋予该属性该值
  • 它对
    年龄
    作业
    重复该过程
  • 它尝试计算表达式
    employees.john.greet
    ,但失败,因为
    employees
    未定义的
  • 如果你把它分成两部分,它就会起作用(直到
    document.write
    把事情搞砸为止):

    这是因为在我们尝试评估
    employees.john.greet
    之前,上面#2中创建的对象的引用已分配给
    employees
    变量


    旁注:

    避免使用
    文档。在现代网页和应用程序中编写
    。相反,使用<代码>文档。编写
    仅在初始页面加载期间按照您可能希望的方式工作;初始页面加载后,它将完全删除现有文档,并开始在同一窗口中编写新文档

    例如,您可以将段落附加到
    document.body
    中,如下所示:

    function display(msg) {
      var p = document.createElement('p');
      p.innerHTML = String(msg);
      document.body.appendChild(p);
    }
    

    使用上述两种方法()

    在JavaScript@shennan:这与范围无关或
    @T.J.Crowder我在胡乱猜测,因为这样的错误对我来说通常是范围问题的结果。这是在他把代码片段放上去之前…谢谢,你的一个步骤有错吗。第8步应该是:它计算“Suzie Alport”,并在名为name的**#7**的对象上创建一个属性,并赋予该属性值。@Abdi:谢谢。当我插入步骤1(我差点忘了!)时,我发誓有两个地方需要更新,但我只找到了一个。那是另一个。:-)
    function display(msg) {
      var p = document.createElement('p');
      p.innerHTML = String(msg);
      document.body.appendChild(p);
    }