如果我能理解以下问题,那么函数作为JavaScript中的对象的概念就可以了。我已经四处搜索并查看了javascript引擎以尝试找到答案,但到目前为止我找不到任何解释都在我脑海中......
如下所示的对象可以理解地布置在哈希映射类型的构造中。
var person = {
firstName:"John",
lastName:"Doe",
age:50,
eyeColor:"blue"
};
然而,说这也是一个对象,我陷入困境:
var name = function () {
alert ('name');
}
就记忆而言,该功能是如何存储的?
"哈希映射中的语句是"在执行顺序中放置的函数?那么每个属性都是在另一个属性之后被调用的?
我可能遗漏了某些东西或者看错了什么。
感谢。
P.S
清理问题2,
假设我的函数中有一个if语句...是否会存储在可通过其属性访问的属性中?
答案 0 :(得分:3)
函数是对象,因为它们可以具有属性和方法。与对象不同,它们也可以被调用,并且总是返回结果。
请注意,ECMAScript(即JavaScript)language specification描述了Function objects应该如何表现而不是底层实现,因此对象的内存中表示将取决于实现。
关于2:请注意,函数的全文可能存储在functionBody
属性中,但函数体不必是JavaScript。例如,它可能是本机代码,在字符串中返回没有意义。
答案 1 :(得分:3)
javascript中的每个对象都有属性(由字符串或符号标识的键值对),并且它具有internal slots。
函数对象name
以与person
对象相同的格式存储,但它们的内部插槽不同。
person
的属性为firstName
,lastName
,age
和eyeColor
,每个属性都包含相应的原始值 person
的内部广告位是(其中包括):
[[prototype]]
,指向Object.prototype
name
的属性为name
,prototype
和length
(典型地为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