1

名前付き関数を変数に割り当てた場合、名前付き関数にアクセスできない理由:

var a = function b() {
    console.log("Hello World");
}
a() // hello world;
b() // b is not defined
b  // b is not defined

現時点では、a変数を削除することはできませんが、をb削除することはできます。ba

delete a //false
delete b //true
a()  //Hello World

b関数はコピーではなく によって参照されるだけではないのにa、なぜa関数がまだそこにあるのでしょうか?

4

1 に答える 1

3

名前付きの関数式(関数宣言ではない!)を使用する場合、関数の名前は関数内のフォームからのみアクセスできます。

仕様から(「識別子」は関数の名前を指します、つまりfunction Identifier() {}):

FunctionExpressionの Identifier は、FunctionExpressionFunctionBody内から参照して、関数が自身を再帰的に呼び出すことができます。ただし、 FunctionDeclaration とは異なり、FunctionExpressionIdentifier は参照できず、FunctionExpressionを囲むスコープには影響しません。


しかし、私は削除することができますb

いいえ、できません。への参照ではないものを渡すdeleteか、参照を解決できない場合は、が返さtrueれます。


これは、すべての関数定義に関する素晴らしい記事です: http://kangax.github.io/nfe/

于 2013-04-26T09:14:50.980 に答える