【问题标题】:Javascript Function ExpressionsJavascript 函数表达式
【发布时间】:2015-10-17 04:33:21
【问题描述】:

我最近一直在尝试学习 javascript 并且有几个问题。

创建函数表达式时:

var greet = function(){
    console.log('Hi');
}

这是创建一个函数对象并让变量“greet”指向内存中的那个函数对象吗?

我的第二个问题,如果你有这样的功能:

function log(a){
    console.log(a);
}

然后你调用那个函数:

log(greet); //greet is the function expression declared above.

所以我知道,当创建一个函数对象时,该对象有两个属性。名称(如果提供,否则为匿名)和一个代码属性,该属性存储包含在函数括号内的代码。现在我对日志函数中的参数“a”在函数对象中的附加位置有点困惑。 “a”只是函数对象 log 的另一个属性,它只是指向传递给 log 函数的任何内容的内存地址吗?在这种情况下,它是一个名为 greet 的函数表达式。任何输入将不胜感激。谢谢!

【问题讨论】:

  • 第一个问题:是的。这也是函数声明中发生的事情,它是 when 发生的事情会有所不同。
  • @Typo 该帖子无助于回答我的问题。我指的是完全不同的东西。
  • 在 comp.lang.javascript 常见问题解答中尝试以下文章:Javascript Closures。虽然它使用 ECMAScript ed 3 语言,但它全面解释了如何创建执行上下文以及如何在作用域链和对象 [[Prototype]] 链上解析标识符。请记住,从那时起,条款发生了变化,但一切都以完全相同的方式发生。

标签: javascript


【解决方案1】:

当函数被调用时:

log(greet)

然后标识符 log 在当前执行上下文中被解析,如果没有找到,则沿着作用域链搜索,在全局执行上下文处结束。如果没有找到,则抛出错误。

在这种情况下,log 是使用函数声明定义的,因此它存在于全局范围内,因此可以找到。检查它的值以确保它是可调用的(同样,如果不是,则抛出错误)如果是,则调用它。

在调用中,标识符 greet 被解析并将其值传递给函数。如果 greet 无法解析(即它在作用域链上不存在),则会引发错误。在这种情况下,它解析为对分配给 greet 的函数的引用。

log 被执行时,会创建一个新的执行上下文。 log 的函数声明定义了一个形参 a(在其形参列表中),因此 a 被创建为 的局部变量>日志。调用中的值依次传递给形参列表中的标识符,因此greet的值被赋值给a。请注意,每次调用函数时都会初始化和创建新的执行上下文。

调用时也遵循同样的流程:

console.log(a);

所以在 console.log 中,对 greet 的引用作为第一个参数传递,所以它现在引用 greet 函数。

console.log 的行为完全依赖于实现,因此内部是未知的,但对于函数来说,大多数倾向于只调用函数的 toString 方法。

ECMAScript 的一个方便的特性是参数对象是由传递给函数的参数创建的,因此如果没有参数可以分配给它们,传递的值总是可以作为参数对象的数字属性使用。所以 console.log 不需要定义任何形式参数,它可以循环遍历它的 arguments 对象并依次处理传递的值。

【讨论】:

  • 哦,这是有道理的。所以基本上变量“a”只是函数greet的执行上下文中的一个变量。它与为 Greet 创建的函数对象没有任何联系。 “a”只是在函数greet的执行上下文中使用正确吗?
  • @ClayHorder — alog 的形式参数,而不是 greet。它传递了一个值(对 greet 的引用),然后将其传递给 log。哦,我想我只是用一句话总结了上面的帖子……
  • 需要注意的是,arguments 对象在使用上存在很多问题,而且它经常使浏览器难以优化您的代码。它最终会消失;它将被替换为rest parameters
  • @UselessCode — 从编程的角度来看,我没有看到 arguments 有任何重大问题,它需要很长时间才能消失(如果有的话)或者rest 参数可以在 web 上安全地使用。 Rest 参数提供了一些好处,但不能完全替代 arguments。有一次,Chrome(或者可能是 Opera,我忘记了)将 arguments 实现为一个数组。我认为过度使用低效库(通常比页面的实际数据内容大很多倍)比优化语言功能的小问题要大得多,而且更容易解决。
猜你喜欢
  • 2023-02-17
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2014-05-23
  • 2013-12-14
相关资源
最近更新 更多