JavaScript学習ノート(11)関数name属性と関数の向上


もう一つの考えは、読み取り専用のname属性のために関数宣言モードを使用することです.
もう一度言ってください.この属性は標準で規定されていませんが、多くの環境でアクセスできます.
関数宣言と命名の関数表現については、name属性が定義されています.
名前のない関数式は、具体的な実装によっては未定義(IE)または空の文字列(Firefox,WebKit)として定義されるかもしれない.
function foo() {} // declaration
var bar = function () {}; // expression
var baz = function baz() {}; // named expression
foo.name; // "foo"
bar.name; // ""
baz.name; // "baz"
Firebugまたは他のデバッグツールでデバッグするコードを使うと、name属性は非常に有用であり、デバッタが関数でエラーを提示する必要がある場合、name属性を確認し、ヒントとして、より正確な情報を提示するようにします.
nameも再帰的な呼び出しに使用されます.再帰的に関数を呼び出すには、関数に名前が必要です.
この二つの場合に興味がないなら、名前のない関数式を使うほうが簡単で簡潔です.
関数式の反対表現を選択した理由は、関数式のより強調された関数がオブジェクトであり、他のオブジェクトとほぼ同じで、いくつかの特殊な言語構造ではないからです.
名前付き関数式を使用して、他の名前の変数に値を与えることができます.
var foo = function bar() {};
しかし、このような行為はいくつかのブラウザで正確に実現されていない(IE)ので、このようなモードは推奨されていない(前の章で最後に使ったが、chromeでテストに合格した).
関数アップグレード(Function Hoisting)
前の議論を通して、関数宣言と関数表現はほぼ等しいと考えられます.
しかし、これは完全に正確ではないです.一つの違いは行為を向上させることです.
ご存知のように、すべての変数は、関数のどこで宣言されていても、背中で関数の一番上に上がります.
これは関数にも適用されます.オブジェクトですので、変数に値が割り当てられます.
関数宣言を使用すると、関数だけでなく関数の定義も向上します.
// antipattern
// for illustration only
// global functions
function foo() {
    alert('global foo');
}
function bar() {
    alert('global bar');
}
function hoistMe() {
    console.log(typeof foo); // "function"
    console.log(typeof bar); // "undefined"
    foo(); // "local foo"
    bar(); // TypeError: bar is not a function
    // function declaration:
    // variable 'foo' and its implementation both get hoisted
    function foo() {
        alert('local foo');
    }
    // function expression:
    // only variable 'bar' gets hoisted
   // not the implementation
   var bar = function () {
     alert('local bar');
   };
}
hoistMe();
この例では、他の普通変数のように、fooとbarは関数hoistMe()の中でトップに引き上げられ、グローバルのfooとbarをカバーする.
異なっているのは局部のfoo()の定義も上部に昇格されて、仕事は正常で、たとえ後で定義しますとしても;
しかしbar()の定義は昇格されておらず、昇格されたのは彼の声明だけであり、undefinedであり、関数としては使用できませんでした.
今は基礎知識と用語については分かりましたが、これからはJavaScript関数に関する良いモデルを見て、コールバックモードから始めます.
最後にもう一度、JavaScriptの二つの非常に重要な特徴を覚えてください.
1.関数はオブジェクトです
2.関数提供スコープ