JavaScript函数是“函数”还是“对象”,还是两者都有?

6

我正在努力理解JavaScript函数的行为。它是函数还是对象,还是两者都有?


可能是Is Function really an Object的重复问题。 - Andy E
4个回答

8

Javascript中的函数是一等对象。因此,它们既是函数也是对象。

由于它们是一等对象,您可以将变量分配给一个函数并为其赋予属性,例如:

var addName=function(){}; 
addName.blah = 1;

如果它们不是一等对象,你将受到语法的限制,但你可以通过两种方式来实现:

function addName(){}

毫无疑问,它们是函数和对象。 - T.J. Crowder
@Chad:对此不加一。+1应该包括一个解释“first class”的链接,因为人们在这里到处抛弃这个术语。或者更好的是,说函数是一级对象,而不使用“一级”这个术语(即用普通人能理解的方式来解释:“是的,Javascript允许你将函数分配给变量并调用变量…”) - palswim

4

这是两者都有的。

JavaScript 中的所有内容,包括函数在内,都被视为“数据”。 我认为这是一个好的图像比喻:

var f = function() { alert('foo'); };

这是将一个变量赋值的过程,和你写下以下代码并没有什么区别:

var f = new String('foo');

不管怎样,你可以编写类似于f.bar = 'baz';的语句来为对象分配属性。唯一的区别在于,如果你拥有的变量恰好是一个函数,那么()运算符(如果您愿意这么称呼它)才会起作用。如果f()是一个函数,那么它是有意义的;如果它是一个字符串或其他数据片段,那么f()就没有意义了。


3
兄弟,你可以发布评论,但是对于一些不属于主题且只是依靠语言的东西,给予-1评分是否有点过于苛刻了?即使依靠语言也是一个非常糟糕的想法。请注意,这并不改变原文的意思。 - T.J. Crowder
1
另外,您不能将属性分配给包含原始值的变量。 - Šime Vidas
1
@Šime Vidas:我不是VoteyDisciple。 - T.J. Crowder
1
你可以这样做:var f = "foo"; f.bar = 4;。发生的是,在 f.bar 中的 f 被转换为一个字符串,然后它的 bar 属性被赋值,然后转换后的字符串值会丢失,因为没有任何引用指向它。但是你确实可以这样做 =) - Claudiu
@Claudiu +1 是的,就是这样。不同之处在于,在此过程中f变量根本没有改变。只有它的值被取出以创建一个字符串对象,等等... - Šime Vidas
显示剩余15条评论

3

JavaScript中所有的函数都是对象。

函数是可以调用的对象。(它们具有内部[[Call]]属性)


0

好吧,我不会说“JavaScript函数是一等对象”,因为其他人已经说过了,但如果你想了解更多关于函数的内容,请查看这个简短的页面:

http://jqfundamentals.com/book/ch02s09.html

顺便提一句,如果你打算学习JavaScript和JQuery,那有一本免费的在线书籍供你阅读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接