【问题标题】:why "fucntion body" is returned instead of "function object" when we console log a function?为什么当我们控制台记录一个函数时返回的是“函数体”而不是“函数对象”?
【发布时间】:2021-12-21 21:01:43
【问题描述】:

我有一个对象“person1”,其中有一个方法“enroll”==>

      function Person(first, last, age, gender) {
        this.enroll = function abc() {
            console.log("hello world")
        }
        // property and method definitions
        this.name = {
          first: first,
          last: last,
        };
        this.age = age;
        this.gender = gender;
        //...see link in summary above for full definition
      }

      let person1 = new Person('Bob', 'Smith', 32, 'male', ['music', 'skiing']);

      console.log(person1);

我的问题是为什么在console.log(person1.enroll) function body or function definition(ƒ abc() {console.log("hello world")}) 上被返回,为什么整个函数对象没有像这样返回=>

ƒ abc()
    arguments: null
    caller: null
    length: 0
    name: "abc"
    prototype: {constructor: ƒ}
    [[FunctionLocation]]: oop2.html:12
    [[Prototype]]: ƒ ()
    [[Scopes]]: Scopes[2]

以及为什么我必须做console.dir(person1.enroll) 才能看到enroll 函数对象的所有属性和方法。为什么console.log(person1.enroll) 不能访问注册函数内的所有方法和属性。

【问题讨论】:

  • 我认为这与this有关

标签: javascript function javascript-objects


【解决方案1】:

为什么log 产生它的作用而dir 产生它的作用的答案是它们是出于特定原因而编写的。根据the documentation

log 背后的意图是“用于日志信息的一般输出”

dir 背后的意图是“显示指定 JavaScript 对象属性的交互式列表。此列表允许您使用显示三角形来检查子对象的内容。”

因此,出于意图,log 不会为您提供所有属性和方法以及其他信息。 log 仅用于“常规日志记录”,为您提供有关该对象的一些提示。我们有dir 用于输出所有内容的明确目的。换句话说,log 没有给你详细的描述,因为控制台对象的设计者选择将这些信息放在dir 中。

(设计人员可以选择使用log 输出更多内容,但他们想为dir 保留更强大的功能。此外,您可能熟悉控制台点日志记录一般对象提供经常没用的[object Object],所以记录一个函数也没有给出完整的细节并不奇怪。)

【讨论】:

  • (日志的行为也会在浏览器之间改变..)
  • 是的,但log 不需要像dir 那样显示所有属性和方法,所以它是两者中更简单的一个
  • 所以你说的是 log 比 dir 简单得多,它是“预定义的”来显示“函数体”而不是整个“函数对象”。我说的对吗?
  • @KunalKhatri:日志未定义为具有特定输出。第一个引用的段落向您展示了它是如何定义的。 确切 console.log(someFunction) 将记录的内容取决于浏览器开发人员如何解释,并且可能因浏览器和同一浏览器的版本而异。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2011-06-02
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多