【问题标题】:Javascript string concatenation with a function behaves strangeJavascript字符串与函数的连接行为很奇怪
【发布时间】:2013-10-04 00:53:44
【问题描述】:

我正在尝试在 javascript 中将 "string"+function(){return "string"} 连接到 document.write() 中。

例如:

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?"}}

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

【问题讨论】:

  • 你希望它做什么?您明确告诉它将函数转换为字符串。如果这是您想要发生的,您不是在 调用 函数。在函数体后添加()
  • "document.write 在 JSFiddle 环境中是不允许的,可能会破坏你的小提琴。"

标签: javascript string function concatenation


【解决方案1】:

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

这是根据语言规范 (15.3.4.2) 发生的:

Function.prototype.toString ( )

函数的依赖于实现的表示是 回来。此表示具有 FunctionDeclaration 的语法。 特别注意空白、行的使用和放置 表示字符串中的终止符和分号是 依赖于实现。

【讨论】:

    【解决方案2】:

    你需要的是:

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

    您没有执行该功能。您可以创建一个立即执行的函数。此外,由于您的操作数之一是字符串,并且您对它们使用 + 运算符,因此您的函数表达式也会自动转换为字符串。

    当您只使用function(){if(true){return "why does it concat?"}} 时,它只是一个函数引用而不是结果,因此您会以这种方式看到结果。您需要执行该函数并获取返回值。

    【讨论】:

    • 其实我知道,但是为什么会这样呢? ://
    • 你真的不需要那些外括号,因为解析器已经知道它正在查看一个表达式而不是函数声明语句。当然不会受伤。
    • @sadaf2605 如果您能解释一下您希望它做什么,那将会很有帮助。
    • @Pointy 是的。它不需要..但我习惯使用它.. :)
    • @sadaf2605 见第二段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多