5

私は JavaScript を学んでおり、巻き上げについては十分に理解できているように感じます。

吊るすのはいいの?可能であれば、次を使用して変数を宣言する必要がありますか

var foo = function() {};

または、代わりにこれを使用する必要がありますか?

function foo() {}

いつ持ち上げるべきで、いつ持ち上げるべきではないのですか? それともまったく問題ですか?

4

3 に答える 3

6

巻き上げは、できるかできないかではなく、JavaScript で行われるだけです。

巻き上げとは、すべての変数宣言が含まれているスコープの先頭に「移動」されるという事実です。

あなたが話しているのは、関数式と関数宣言の使用です。どちらのスタイルも問題ありませんが、巻き上げられるものにわずかな違いがあることを覚えておいてください。

var foo = function() {} // foo gets hoisted, but not the function itself

function foo(){}        // the variable and the function get hoisted

詳細については、JavaScript でのホイストについて書いた記事をご覧ください: http://www.kenneth-truyers.net/2013/04/20/javascript-hoisting-explained/

于 2015-04-21T09:19:50.593 に答える
3

この質問に対する客観的な答えはありません。それは個人的な好みに帰着します。

私自身のコードでは、var foo = function() {};. IMHO、ソースコードの順序が重要であるため、関数の巻き上げを回避すると、コードが理解しやすくなります。

更新: ES6/ES2015 仕様には、特定のケースに対して同じ推奨事項があります。

ECMAScript 2015 より前の ECMAScript 仕様では、FunctionDeclaration の発生が Block ステートメントの StatementList の要素として定義されていませんでした。ただし、その形式の FunctionDeclaration のサポートは許容される拡張機能であり、ブラウザーでホストされるほとんどの ECMAScript 実装で許可されていました。残念ながら、そのような宣言のセマンティクスは実装によって異なります。これらのセマンティックの違いにより、ブロック レベルの関数宣言を使用する既存の Web ECMAScript コードは、その使用法がそのような宣言のすべてのブラウザー実装のセマンティック インターセクションに依存する場合にのみ、ブラウザー実装間で移植可能です。

たとえば、次のコードの動作は ES5 では定義されておらず、ブラウザー/エンジン/実装によって異なります。

if (true) {
  function foo() { return 1; }
} else {
  function foo() { return 2; }
}
console.log(foo()); // `1` or `2`?

ただし、次のコードには、完全に明確に定義された相互運用可能な動作があります。

var foo;
if (true) {
  foo = function() { return 1; }
} else {
  foo = function() { return 2; }
}
console.log(foo()); // `1`

TL;DR できる限り関数の巻き上げを避けてください。

于 2015-04-21T09:20:50.663 に答える
0

巻き上げのため、関数の先頭ですべての変数を宣言することをお勧めします....(ES6ではありません)。

var foo = function() {};function foo() {}は 2 つの異なるものです。最初のものは変数を作成し、匿名関数を渡します.2番目のものは「単なる」関数です。

どちらが優れているとは断言できません。それは文脈に依存します。

于 2015-04-21T09:20:46.007 に答える