了解JavaScript函数表达式VS函数声明,但是这是什么? 命名的功能体现在哪里? [重复

2019-07-18 07:49发布

可能重复:
JavaScript的:VAR = functionName函数(){} VS功能使用functionName(){}
是什么VS声明Javascript中的函数表达式之间的区别?

我知道函数的声明和表达式之间的差异,但都碰到过这样的代码,涉及函数名称和想明白当我们运行它会发生什么:

var abc = function def() {
    console.log("Wait! What??");
}

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

  1. 发生什么abc ? 为什么它的工作原理? abc可以称得上但不是def的,为什么?
  2. 它是一个函数声明或表达式?
  3. defundefined -为什么? 如果它应该是,是否有内存泄漏?
  4. 为什么abc.prototype的功能def

谢谢

Answer 1:

恰好为abc什么?

它包含一个函数对象。 如果你什么都不做吧,这将是垃圾收集。

为什么它的工作原理?

为什么不? 什么“作品”?

ABC可以称得上但不能闪避,为什么呢?

这是从外面只是真实的,而不是在IE浏览器。 见下文。

它是一个函数声明或表达式?

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

DEF是不确定的 - 为什么?

只有从外面。 函数表达式不会产生变量。 “DEF”是名称的功能,并且在函数内部它是对功能的基准为好。 这允许例如递归不使用任何外变量。

var abc = function def() {
    def === abc; // true
    def.name; // "def"
}
abc();
def; // undefined

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

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

为什么abc.prototype功能是高清?

它不是。 这只是一个对象。 也许它显示在你的控制台名称,属于一个名为“高清”功能。



Answer 2:

这是一个名为功能expressio ñ。 对于这方面的一个可能的用途是:

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

要小心



Answer 3:

这是一个名为函数表达式。

相反,函数声明函数表达式的标识符是不是强制性的。

你的函数def不会立即调用-全功能传递给abc ,需要明确地援引abc()

§13的ES5规范国家命名的函数表达式是如何建造的。 阅读关于命名函数表达式如何建立第三个生产规则。

注:在FunctionExpression标识符可以从FunctionExpression的函数体中被引用,以允许函数递归调用自身。 然而,与在FunctionDeclaration,在FunctionExpression标识符无法从引用,不影响封闭FunctionExpression范围。

所有最新的浏览器正确地处理这个问题,所以您不必担心和内存泄漏或其他怪异的东西(不正确的处理是只有在旧版IE <= 8)。



Answer 4:

这是一个函数表达式 2

函数表达式可以有名字为好; 函数表达式的名称仅在函数体1的范围。 (由于ECMAScript的第5版弃用arguments.callee ,这是写一个递归的“匿名”功能只有简单的方法。)

因为它一个函数表达式,该名称可以不 1介绍在以下范围外一个新的绑定。

此外, 所有功能都在JavaScript对象。 在f(..) f 之前它是“调用”与被评估(..) ; 如果f没有评估的功能,然后抛出一个错误。 这就是为什么回调,这只是功能,可以通过变量命名,并作为参数传递。

此外,检查有关原型的假设/断言:

var abc = function def() {}
abc.prototype === abc // -> false
abc.name              // -> "def"

1个见BERGI的答案。

2如何轻松分辨哪个是哪个?

语法规则允许function ..被解析为函数声明时,它是一个SourceElement虽然大多数发动机仍将[错误]解析函数声明为一个声明 。 SourceElement制作发生在一个程序或一个功能的顶级“块”的顶级“块”。

在任何情况下,只要有一个function ..出现在需要的地方表达 ,它被解析为一个函数表达式。 这解析为函数表达式的例子:

// Can only assign values: Statements do not have values!
var f = function () {}        
var g = function gName () {}  // see Bergi's answer

// Can only pass values: Statements do not have values!
doIt(function () {})          // callback / "anonymous function"

// IIFE: Immediately-Invoked Function Expression
;(function () {})()           // standard IIFE
;(function () {} ())          // alternative standard IIFE
;+function () {} ()           // curious way to write an IIFE
// basically you can use any unary operator to turn it into an expression not only
//  + but also - ! ~ and so on which will modify the return value accordingly

的一点是,在上述情况中的一个一个, function ..出现在需要表达式语法位置并因此解析为一个函数表达式。 (在高于避免“模糊”的线条与ASI,它在自由分号式书写时等我宁愿要求开始时的分号。)

然而。 ;function () {} ();function f () {} ()都是无效的语法-为什么? ;-)



Answer 5:

你举的例子是一个(命名)函数表达式。

两者之间的区别是在浏览器如何加载它们。

在执行任何代码之前的函数声明被加载。
函数表达式被加载仅解释器到达该的代码。

这意味着:

abc();
var abc = function() {
    console.log("Wait! What??");
}

将无法正常工作,但是:

def();
function def() {
    console.log("Wait! What??");
}

将。

现在,在你的榜样,您可以访问def ,但只有函数本身内。

var abc = function def() {
    console.log(def);
}
abc();

// Logs:
//function def() {
//    console.log(def);
//}


文章来源: Know JavaScript Function Expression vs Function Declaration, but what is this? Named Function Expression? [duplicate]