JavaScript - 作为对象的功能

时间:2016-03-03 01:31:10

标签: javascript function object

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

如下所示的对象可以理解地布置在哈希映射类型的构造中。

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

然而,说这也是一个对象,我陷入困境:

var name = function () {
    alert ('name');
}
  1. 就记忆而言,该功能是如何存储的?

  2. "哈希映射中的语句是"在执行顺序中放置的函数?那么每个属性都是在另一个属性之后被调用的?

  3. 我可能遗漏了某些东西或者看错了什么。

    感谢。

    P.S

    清理问题2,

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

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

函数对象name以与person对象相同的格式存储,但它们的内部插槽不同。

  • person的属性为firstNamelastNameageeyeColor,每个属性都包含相应的原始值
  • person的内部广告位是(其中包括):

    • [[prototype]],指向Object.prototype
  • name的属性为nameprototypelength(典型地为Function instances

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

免责声明:这只是它的行为方式,引擎可以按照自己的意愿实现这一点。尽管如此,它仍然可以作为心智模型,并且理解对象在公开可见属性下面有一层是很重要的。

答案 2 :(得分:1)

如果您只想进行常规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"

答案 3 :(得分:1)

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

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

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

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