Javascript函数表达式

Javascript Function Expressions

本文关键字:表达式 函数 Javascript      更新时间:2023-09-26

我最近一直在尝试学习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不需要定义任何形式参数,它可以循环遍历参数对象并依次处理传递的值。