2016-03-03 29 views
2

如果我能理解以下问题,那么JavaScript中的对象的函数的概念就可以。我搜索了四周,看着javascript引擎试图找到答案,但没有任何解释,我发现迄今为止在我的心中...JavaScript - 作为对象的函数

像下面的一个对象是可以理解的布局在一个哈希映射类型的构造。

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

然而,要说这也是一个对象是我卡住:

var name = function() { 
    alert ('name'); 
} 
  1. 在内存方面,如何保存这个功能呢?

  2. 函数的“散列图”中的语句是否按执行顺序排列?因此,每个财产都是在另一个之后被调用的?

我可能错过了某些东西或者看到错误的东西。

谢谢。

P.S

要澄清的问题2,

说我有一个,如果我的函数中的语句......那将是存储在一个属性进行访问,通过它的一个属性?

+3

为什么人们投票反思好的发人深省的问题?可能是因为他们无法在其他人面前提出一个1行的答案。这是因为这不是'请修复我的错字'排序问题 –

+1

与C不同,没有标准定义JavaScript的内存布局等标准。不仅总体上没有单个答案,在某些情况下,单个引擎可能没有单个答案,因为JIT可以根据使用方式对代码进行不同的编译和评估。在* some *的情况下,仅用作函数的函数可能仅存储为函数,没有为存储属性分配任何特定空间。 (这是我回避一个复杂的问题。) –

+0

函数具有属性和方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function –

回答

3

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

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

  • person的属性是firstNamelastNameageeyeColor,每个保持各自的原始值
  • person的内部插槽(主要):

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

  • name的内部插槽(主要):
    • [[prototype]],指向Function.prototype
    • [[ECMAScriptCode]],指向功能代码
    • [[Environment]],指向在
    • 中创建闭合的范围

免责声明:这就是它唯一的行为,引擎可以实现这不过他们想要的。尽管如此,它仍然可以作为一个心理模型,并且了解对象在公共可见属性下面有一个图层是很重要的。

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"

1

答案1.是:这取决于执行。

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

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

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

+0

对不起,希望这清除了我的问题 - 说我有我的函数内的if语句...将它存储在一个属性可以通过其属性之一访问? – Brummy

+0

根据额外信息更改我的答案。 – z5h

3

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

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

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

+0

当你说函数的主体不一定是JavaScript时,你是什么意思?我将这个问题解释为:“描述JavaScript函数的性质......”,这意味着,根据定义,该正文是JavaScript。你指的是实现者(浏览器,服务器等)是否将文本或其他形式的内容存储在内存中? –

+2

参见http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.24 - “一个函数包含可执行代码和状态,用于确定它在被调用时的行为。_函数的代码可能会也可能不会写在ECMAScript._“(重点是我的)。例如。像document.getElementById这样的主机方法 - 如果你调用'.toString()'你会得到'[native code]'。 – Hamish

相关问题