JS如何处理函数参数?

时间:2016-02-20 01:54:20

标签: javascript function parameters

我知道在js函数中是对象,据我所知,对象具有属性和方法。但我不知道JS引擎如何处理函数参数?(因为它们不像属性那样可访问)。
在下面的代码中:



function func(parameter1) {
  console.log(parameter1);
};
func();



 我不明白为什么结果应该是"未定义"。 js引擎是否将参数视为变量?如果是这样,他们的变量环境是什么? 另一件令我困惑的事: 下面的匿名函数是在哪里创建的?它在哪里举行?以后可以在代码中访问吗?



function a(par1) {
  par1();
}

a(function() {console.log("Hello");)




对不起英语,感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

参数是在处理的编译阶段在函数范围内声明的变量。

您获得的未定义结果表示该变量存在,但尚无值。未定义是其默认值。

请阅读此处以了解有关它的更多信息 https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch2.md

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/undefined

编辑:忘了你的第二个问题。

匿名函数是在全局范围内创建的(如果它们不在另一个范围内)并且您无法再次调用它们

答案 1 :(得分:1)

请参阅10.5 Declaration Binding Instantiation

  

每个执行上下文都有一个关联的VariableEnvironment。   在ECMAScript代码中声明的变量和函数在   执行上下文作为绑定添加到其中   VariableEnvironmentEnvironment Record。对于功能代码,   参数也作为绑定添加到Environment Record

如果未指定参数,则相应参数的值将变为未定义:

  
      
  1. func 成为[[Call]]内部方法启动执行代码的函数。让名称 func 的值   [[FormalParameters]]内部财产。
  2.   
  3. argCount args 中的元素数。
  4.   
  5. n 为数字0。
  6.   
  7. 对于名称中的每个String argName ,按列表顺序执行      
        
    1. n n 的当前值加1。
    2.   
    3. 如果 n 大于 argCount ,请 v 未定义,否则请 v 是args的 n '元素的值。
    4.   
  8.   

将函数表达式作为参数传递与传递任何其他内容没有什么不同。根据{{​​3}}和13 Function Definition创建一个函数对象,该值作为参数传递。它可以通过参数或arguments

获得

答案 2 :(得分:1)

参数是函数范围内的变量。

结果是undefined因为除非你明确return函数中的某些内容,否则函数会隐式返回“undefined”。

您即时创建的匿名函数只能在a函数的范围内作为par1访问,就像您输入的任何其他参数一样。 附注:您的匿名函数缺少}