2012-06-04 73 views
4

我最近遇到了一些JavaScript问题,它违背了我的编程背景的每个骨骼。 Javascript经常对我这样做,所以我没有那么惊讶。Javascript如何处理函数参数

我有一个功能,因为这样...

function x(param1, booleanParam, arrayParam){ 
    .... 
} 

我得到一个运行时错误说arrayParam.length没有定义。在调试时,我看到这是真的,并去找出原因。原来我曾在我的函数调用这样被遗忘的一个逗号......

x(param1, true [arrayJunk]); 

我有是找出为什么这个电话是在所有提出的问题?为什么这不是一个编译错误,Javascript如何看待这个问题并思考:“是的,这看起来可能有用!”

在此先感谢您分享的任何启示!

+0

这种情况下,使用“Array”构造函数而不是文字语法会提供一个有用的SyntaxError,但是您可能会遇到传递单个数字参数导致不同静默错误的潜在问题。 – 2012-06-04 16:55:48

回答

3

这是一个索引表达式。
someArray[someIndex]的语法相同。

它也将最终传递undefined作为第二个参数,除非arrayJunk碰巧是布尔基元属性的名称。

+0

在JavaScript中,“true”不是保留字吗?它如何尝试做一个基础性的索引? – Shaded

+0

@Shaded:在Javascript中,一切都是一个对象。例如,'true [“toString”]()'将返回'“true”'。 – SLaks

+2

并非一切都是一个对象; '1,true和“23443”'是原语。只有'typeof'返回“对象”的东西才是真实的对象。但是一切都可以转换成一个对象,这就是JS引擎的功能 –

0

在这种情况下,表达式被解释为索引。基本上是一样的

someArray[42] 

所以,它被看作是有两个参数,而不是3

2

函数调用什么情况如下:

  • JavaScript引擎转换trueBoolean对象(不是原语)
  • 然后它尝试访问存储在arrayParam中的属性名称
  • 属性不存在,所以它返回undefined

如果arrayParam是字符串"toString",它会返回一个函数对象,如果你通过

0

许多动态语言不检查过多或过少一个函数的参数。

虽然这有时会掩盖错误,但它也允许您推出自己的defalut参数方案。