Javascript函数表达式
Javascript Function Expressions
我最近一直在尝试学习javascript,并有几个问题。
创建函数表达式时:
var greet = function(){
console.log('Hi');
}
是创建一个函数对象,并有变量"greet"指向该函数对象在内存中?
我的第二个问题如果你有一个这样的函数:
function log(a){
console.log(a);
}
然后调用该函数:
log(greet); //greet is the function expression declared above.
所以我知道,当一个函数对象被创建时,有两个属性被赋予对象。名称(如果提供,否则匿名)和code属性,该属性存储函数括号内包含的代码。现在我有点困惑了,log函数中的参数a在函数对象中的位置。"a"只是函数对象log的另一个属性,它只是指向传递到log函数的任何东西的内存地址?在本例中,它是一个名为greet的函数表达式。任何意见将不胜感激。谢谢你!
当函数被调用时,如:
log(greet)
则在当前执行上下文中解析标识符log,如果没有找到,则沿着作用域链搜索,以全局执行上下文中结束。如果未找到,则抛出错误。
在这种情况下,log已经使用函数声明定义,因此它存在于全局作用域中,因此可以找到。检查它的值以确保它是可调用的(同样,如果不是,则抛出错误),如果是,则调用它。
在调用中,标识符greet被解析并将其值传递给函数。如果greet无法解析(即它在作用域链上不存在),则抛出错误。在本例中,它解析为对分配给greet的函数的引用。
当log执行时,将创建一个新的执行上下文。log的函数声明定义了一个形式参数a(在其形式参数列表中),因此a被创建为log的局部变量。调用中的值按顺序传递给形式参数列表中的标识符,因此greet的值被分配给a。请注意,每次调用函数时都会初始化和创建一个新的执行上下文。
调用
时遵循相同的过程:console.log(a);
以便在console.log中,对greet的引用作为第一个参数传递,因此它现在引用greet函数。
console.log的行为完全依赖于实现,所以内部是未知的,但对于函数来说,大多数倾向于只调用函数的toString方法。
ECMAScript的一个方便的特性是,将传递给函数的参数创建一个arguments对象,因此,如果没有可分配给它们的参数,则传递的值总是作为arguments对象的数字属性可用。所以console.log不需要定义任何形式参数,它可以循环遍历参数对象并依次处理传递的值。
- 调用正则表达式匹配的函数
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 参数更改时,角度表达式中的函数不更新
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配
- 能够在定义函数表达式之前使用它
- 函数表达式,返回回调函数
- JavaScript中的立即调用函数表达式(IIFE)-传递jQuery
- 函数声明与函数表达式之间的性能差异
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- 立即调用函数表达式(IIFE)相对于普通函数的优势
- 如何通过jsp表达式标记将java字符串变量传递给javascript函数
- 用正则表达式在js中进行函数修剪
- 错误-应为赋值或函数调用,但实际看到的却是表达式
- Javascript错误正则表达式不是函数
- “期望赋值或函数调用,而是看到了表达式.” - 不必要的控制台.log
- 为过滤器创建javascript正则表达式函数
- 如何修复这个正则表达式函数
- 传递变量来替换正则表达式函数
- 正则表达式函数4个字母和4个数字