Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 奇怪的JS语法:函数声明中的数学运算符_Javascript_Syntax - Fatal编程技术网

Javascript 奇怪的JS语法:函数声明中的数学运算符

Javascript 奇怪的JS语法:函数声明中的数学运算符,javascript,syntax,Javascript,Syntax,我只是玩了一下,发现了非常奇怪的结构。它是函数名和传递参数之间的除法运算符 c/({"count":8098,"url":"http:\/\/example.com\/"}); 我认为这应该引发解析器异常,但它是有效的− 只返回NaN,而不是undefined。它也与*和-运算符类似,而+返回c.toString()(或.valueOf,我不知道)。 更重要的是,如果我不将对象传递给函数,就会抛出语法错误。以下是一些例子: function c() {} >> undefined

我只是玩了一下,发现了非常奇怪的结构。它是函数名和传递参数之间的除法运算符

c/({"count":8098,"url":"http:\/\/example.com\/"});
我认为这应该引发解析器异常,但它是有效的− 只返回
NaN
,而不是
undefined
。它也与
*
-
运算符类似,而
+
返回
c.toString()
(或
.valueOf
,我不知道)。 更重要的是,如果我不将对象传递给函数,就会抛出语法错误。以下是一些例子:

function c() {}
>> undefined

c
>> function c() {}

c/()
>> SyntaxError: Unexpected token )

c/({});
>> NaN

c+({})
>> "function c() {}[object Object]"

c({})
>> undefined
我在Chrome上运行了这个程序,但我相信如果Twitter把它作为回应,它在任何地方都能运行。
所以为什么会这样,它到底是如何工作的?我相信这与函数返回值及其隐式类型强制有关,但我仍然不明白。

您的URL在API调用中没有转义,因此twitter错误地读取了它,并创建了无意义的语法。 如果将URL参数设置为转义值(通过
encodeURIComponent
),它将生成
c({some:“Object”})
,这是一个JSONP响应-JSONP本质上是一个函数调用,通过注入脚本标记来工作

因此,twitter并不是故意产生这种响应的,您传递的是有问题的参数,它并没有优雅地失败

至于为什么在一个对象中划分一个函数是
NaN
——在JS中,通常数学运算符不会抛出很多错误。JavaScript告诉你——你试图执行一个没有意义的数学运算,结果不是一个数字——NaN

对于时髦的结果:

c/()
就是无效的语法,简单地说,你是白费力气,
5/()
同样会失败

c/({})
用一个对象来划分一个函数是没有意义的,所以它给你的是“不是一个数字”。我可以添加一个规范引用,但我认为除了“没有办法用不同的方式解释这个”之外,没有更多的内容可以添加

+
运算符除了执行数字加法外,还执行字符串串联-因此这里发生的是,函数和对象都调用了
toString
,您可以看到串联的结果

c({})

这只是函数调用的返回值

它实际上不是函数定义。它只是
c
中的任何内容与对象之间的除法运算。我不完全清楚他们为什么这么做。我知道这不是一个定义。对于jsonp,在调用服务器之前定义了
c
。这是函数调用。@Tommi不,这不是函数调用。该表达式中的括号被解析为普通代数分组运算符,而不是函数调用运算符。多亏了all。我应该在
c
中加入一些逻辑来确保它被调用。你是对的。我应该在
c
函数中加入一些逻辑来检查它是否被调用<代码>函数a(){console.log(“in”);}仍然返回NaN并且不打印“in”。谢谢你这么快的回复。现在我觉得自己太愚蠢了。不要为这个问题感到难过——这在Twitter的API和JavaScript语言上都是令人困惑的行为。在让你知道问题所在方面,两人本可以做得更好。
c({})