2013-09-27 38 views
-2

我试图在javascript中使用来连接类似"string"+function(){return "string"}的东西。使用函数的Javascript字符串连接表现很奇怪

例如:

document.write("I don't know "+function(){if(true){return "why does it concat?"}}); 

它打印这样的波纹管(看到它在的jsfiddle运行:http://jsfiddle.net/sadaf2605/3AuLD/):

I don't know function(){if(true){return "why does it concat?"}} 

我知道我写的东西非常非常愚蠢的,我需要一个函数来完成它,但仍然为什么要打印这样的东西?我很好奇!

+0

你期望它做什么?您明确告诉它将函数转换为字符串。如果这就是你想要发生的事情,你不会*调用函数。在函数体后添加'()'。 – Pointy

+0

“在JSFiddle环境中不允许使用document.write,并且可能会破坏你的小提琴。” –

回答

3

如果你问它为什么打印它做了什么,那是因为你的函数被转换为一个字符串(通过它的toString方法),因为你试图连接一个字符串和一个函数对象。当一个函数被转换为一个字符串时,它的源代码被返回(除非它是一个本地函数)。

发生这种情况,根据该语言规范(15.3.4.2):

Function.prototype.toString()

功能的实现相关的表示是 返回。该表示具有FunctionDeclaration的语法。 特别注意,在表示字符串中使用和放置空格,行 终止符以及分号是 实现相关。

+0

哇,谢谢你这有趣!我不知道:D – sadaf2605

3

你需要的是:

document.write("I don't know "+ (function(){if(true){return "why does it concat?"}})()); 
           ^_______            ^_____ 

您没有执行该功能。你可以创建一个即时函数来执行。此外,由于您的操作数中有一个字符串,并且您正在使用+运算符,您的函数表达式也会自动转换为字符串。

当你只使用function(){if(true){return "why does it concat?"}}它只是一个函数引用而不是结果,所以你看到了这样的结果。您需要执行该函数并获取返回值。

+0

其实我知道,但为什么它应该像那样? :/ – sadaf2605

+1

因为解析器已经知道它正在查看一个表达式而不是函数声明语句,所以您并不需要这些外部圆括号。当然不能伤害。 – Pointy

+0

@ sadaf2605如果你能解释你期望它做什么,它会有很大的帮助。 – Pointy