知道JavaScript函数表达式与函数声明,但这是什么?命名函数表达式?

Om *_*kar 23 javascript oop

可能重复:
JavaScript:var functionName = function(){} vs function functionName(){}
Javascript中的函数表达式与声明有什么区别?

我知道函数声明和表达式之间的区别,但是遇到了涉及函数名称的代码,并且想要了解运行它时会发生什么:

var abc = function def() {
    console.log("Wait! What??");
}
Run Code Online (Sandbox Code Playgroud)

我知道这不是JavaScript的一种方式,但只是想知道一些事情:

  1. 怎么了abc?为什么会这样?abc可以叫但不是def,为什么?
  2. 它是函数声明还是表达式?
  3. defundefined- 为什么?如果它应该是,是否有内存泄漏?
  4. 为什么abc.prototype功能def

谢谢

Ber*_*rgi 9

abc怎么了?

它包含一个函数对象.如果你什么都不做,它将被垃圾收集.

为什么会这样?

为什么不?什么"有效"?

可以调用abc而不是def,为什么?

这只适用于外部,而不是IE.见下文.

它是函数声明还是表达式?

它是一个函数表达式.您可以很容易地看到它,因为它是赋值表达式的一部分; 声明总是需要在顶层(函数或全局代码)

def未定义 - 为什么?

只有来自外面.函数表达式不会创建变量."def"是函数的名称,函数内部也是函数的引用.这允许递归,例如不使用任何外部变量.

var abc = function def() {
    def === abc; // true
    def.name; // "def"
}
abc();
def; // undefined
Run Code Online (Sandbox Code Playgroud)

如果它应该是,是否有内存泄漏?

是的,在Internet Explorer中.它从该代码创建了两个不同的函数.有关详细信息,请参阅http://kangax.github.com/nfe/#jscript-bugs

为什么abc.prototype是函数def?

它不是.这只是一个对象.也许它在您的控制台中以该名称显示,属于名为"def"的函数.


Koo*_*Inc 5

这是一个命名函数expressio n.可能的用途可能是:

var abc = function def() {
    def.test = 'Wait!'; //< sort of a static property
    console.log(def.test+" What??");
}
Run Code Online (Sandbox Code Playgroud)

要注意.