【问题标题】:JavaScript - Functions as objectsJavaScript - 作为对象的函数
【发布时间】:2016-03-03 01:31:09
【问题描述】:

如果我能理解以下问题,我可以接受 JavaScript 中函数是对象的概念。我已经四处搜索并查看了 javascript 引擎以尝试找到答案,但到目前为止我没有找到任何解释在我的脑海中......

可以理解,像下面这样的对象以哈希映射类型的构造布局。

var person = {
    firstName:"John",
    lastName:"Doe",
    age:50,
    eyeColor:"blue"
};

但是,说这也是一个对象是我卡住的地方:

var name = function () {
    alert ('name');
}
  1. 在内存方面,这个函数是如何存储的?

  2. 函数“哈希映射”内的语句是否按执行顺序排列?所以每个属性都被一个接一个地调用?

我可能遗漏了一些东西或想象了一些错误的东西。

谢谢。

附言

为了解决问题 2,

假设我的函数中有一个 if 语句...是否会存储在可通过其属性之一访问的属性中?

【问题讨论】:

  • 为什么人们会否决发人深省的好问题?可能是因为他们无法在其他人之前提出 1 行答案。那是因为这不是“请修正我的错字”排序问题
  • 与 C 不同,没有标准定义诸如 JavaScript 的内存布局之类的东西。不仅总体上没有单一的答案,在某些情况下,单个引擎可能也没有单一的答案,因为 JIT 可以根据使用方式不同地编译和评估代码。在一些 的情况下,仅用作函数的函数可能仅存储为函数,而没有分配任何特定的空间来存储属性。 (这是我在回避一个复杂的问题。)
  • 问题2没看懂,hash map里面没有语句,没有执行。
  • 啊...您是否试图在两种情况下都以相同的方式解释 { ... } 的内容?那可能会误导你。函数体的语法与对象字面量完全不同;他们只是碰巧使用了相同的外部分隔符。

标签: javascript function object


【解决方案1】:

javascript 中的每个对象都有属性(由字符串或符号标识的键值对)并且它有internal slots

函数对象nameperson对象的存储格式相同,但它们的内部槽不同。

  • person 的属性是 firstNamelastNameageeyeColor,每个属性都有各自的原始值
  • person 的内部插槽是(除其他外):

    • [[prototype]],指向Object.prototype
  • name 的属性是nameprototypelengthFunction instances 的典型属性)

  • name 的内部插槽是(其中包括):
    • [[prototype]],指向Function.prototype
    • [[ECMAScriptCode]],指向函数的代码
    • [[Environment]],指向创建闭包的范围

免责声明:这只是它的行为方式,引擎可以根据需要实现它。尽管如此,它仍然可以很好地作为一种心理模型,重要的是要了解对象在公开可见的属性之下有一层。

【讨论】:

    【解决方案2】:

    函数是对象,因为它们可以具有属性和方法。与对象不同,它们也可以被调用并且总是返回一个结果。

    请注意,ECMAScript(即 JavaScript)language specification 描述了 Function objects 的行为方式而不是底层实现,因此对象的内存表示将取决于实现。

    关于 2:请注意,函数的全文可能存储在 functionBody 属性中,但函数的主体不必是 JavaScript。例如,它可能是本地代码,在字符串中返回没有意义。

    【讨论】:

    • 你说函数的主体不必是 JavaScript 是什么意思?我将问题解释为:“描述 JavaScript 函数的性质......”这意味着,根据定义,主体是 JavaScript。您是指实现者(浏览器、服务器等)是否将正文作为文本或其他形式存储在内存中?
    • 参见ecma-international.org/ecma-262/5.1/#sec-4.3.24 - “一个函数包含可执行代码和状态,这些代码和状态决定了它在调用时的行为方式。一个函数的代码可能用ECMAScript编写,也可能不用。”(强调我的)。例如。像 document.getElementById 这样的宿主方法 - 如果你调用 .toString(),你会得到 [native code]
    【解决方案3】:

    如果您只想进行常规的 JavaScript 编码,我认为您真的不需要担心浏览器或服务器如何存储函数或其他任何东西。我确实认为您误解了函数的对象性质。函数内的代码行不是哈希映射的各个部分。相反(这只是开始触及这个概念),函数可以具有具有名称和值的属性,就像常规对象可以具有这样的属性一样。下面的代码演示了这一点。

    var myFunc = function() {
      var x = "hello".toUpperCase();
      document.write('<p>' + x + '</p>');
    };
    
    myFunc.favoriteColor = "red";
    
    myFunc(); // runs the function and shows the text "hello"
    document.write("<p>" + myFunc.favoriteColor + "</p>"); // shows the text "red"

    【讨论】:

      【解决方案4】:

      1. 的答案是:这取决于实现。

      第二个问题没有任何意义。

      我认为您正在查看语法,并假设由于声明数据的方式和声明函数的方式,函数可以被视为语言中的数据。
      事实并非如此。

      有些语言就是这种情况。 Lisp 和 Prolog 是最常见的例子。看: https://en.wikipedia.org/wiki/Homoiconicity

      【讨论】:

      • 抱歉,希望这能解决我的问题 - 假设我的函数中有一个 if 语句...是否会存储在可通过其属性之一访问的属性中?
      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多