問題タブ [function-expression]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - javascript関数を再帰的に呼び出す
次のような変数で再帰関数を作成できます。
これで、functionHolder(3);
を出力します3
2
1
0
。私が次のことをしたとしましょう:
copyFunction(3);
上記のように出力3
2
1
0
されます。その後、次のように変更functionHolder
した場合:
次に、期待どおりに、functionHolder(3);
を与えStop counting!
ます。
copyFunction(3);
これで、関数(それ自体が指す)ではなく、3
Stop counting!
参照するとおりになります。functionHolder
これは状況によっては望ましい場合がありますが、関数を保持する変数ではなく、それ自体を呼び出すように関数を作成する方法はありますか?
つまり、電話をかけたときにこれらすべての手順を実行しても得られるように、回線のみを変更することは可能ですか?試しましたが、エラーが発生します。functionHolder(counter-1);
3
2
1
0
copyFunction(3);
this(counter-1);
this is not a function
javascript - ボタンの onclick ハンドラとして使用する関数式を渡す
ボタンの場合、これが呼び出す関数と、その呼び出しで使用される値を実行時に設定する必要があります。私はこれを次のように行うことができます:
代わりに試してみると:
Firebug は私に
「関数ステートメントには名前が必要です」
とはいえ、私の知る限り、ここでは関数式を使用しています。
javascript - Javascript 関数式を使用する好ましい方法は何ですか?
JavaScript 関数式を呼び出すときに、次のようなさまざまなパターンを見てきました。
パターン #1
パターン #2
パターン #3
私のテストでは、すべてが機能しているようです (少なくとも最新のブラウザでは)。私の「好み」では、パターン #3 の方が優れています。これは #1 よりも明示的であり、#2 とは対照的に、実際に呼び出す前に関数を返すためです。
しかし、好ましいものまたはより正しいものがあるかどうか、私はさまよっていました...
javascript - JavaScript コードが式かどうかを判断する
次の名前の関数を使用して、isExpression
JavaScript コードが式であるかどうかを判断しています。
1 つを除くすべてのテスト ケースで正しく動作します。誤って a を aFunctionDeclaration
として扱い、代わりにFunctionExpression
を返します。パーサーを書かずにこの問題を解決する方法はありますか?true
false
javascript - すべての関数式が突然関数として認識されなくなった
多くの関数式を含む大量の JavaScript ファイルがあります。突然コンソールに次のエラーが表示されます。
IE で
Firefox の場合
これは私が関数を呼び出す方法です:
これは機能です:
これは、すべての関数式で発生しています。1つを関数宣言に変更すると機能しますが、その中の他の関数式呼び出しで失敗します。一体何?
javascript - Javascript: 同じ関数を呼び出す無名関数として変数を定義する
次のような関数が与えられます。
これで、上記の関数に 1 つずつフィードする必要があるオブジェクトの配列 ( RecordArray
) ができました。つまり、次に呼び出す前にコールバックするまで待機する必要があります。
だから私は思いついた:
ご覧のとおり、変数自体が定義さWorkFunc
れている無名関数内から実際に呼び出されます。これは ECMAScript/Javascript で合法ですか? (標準に準拠したすべてのブラウザで動作するという法的意味)WorkFunc
つまり、私にとっては、 JavascriptやC/C++/ObjC/Javaとほとんど同じvar c = c + 1;
で、定義中に変数を参照しているため、違法であるか、動作が undefined である必要があります。int c = c + 1;
ただし、一部のブラウザでは問題なく動作するようです。
さらに調査と検討を重ねた結果、別の解決策を思いつきました。
- 解決策 1: 無名関数 (
MyFunc
) に名前を付けて、内部でその名前を使用できるようにします (ここを参照)。
コード:
- 解決策 2: 関数式の代わりに関数宣言を使用して、(正確ではありませんが) 再帰関数のようにします (ここを参照)。
コード:
NextStepFunc
解決策 3: 内部を参照する必要がないように、変数をパラメーター ( ) として渡しますWorkFunc
(これは非常におかしいようです)。
コード:
しかし、私の質問はまだ残っています: 私の元の解決策は合法でしたか?
javascript - 関数宣言または関数式
ブロック スコープで関数を定義するときに問題が発生しました。次のプログラムを検討してください。
私は、このプログラムが警告することを期待していましたMerry Christmas!
。ただし、Firefox では次のようになりますReferenceError
。
Opera と Chrome では、期待どおりに挨拶を警告します。
明らかに Firefox はブロック スコープ内の関数を としてFunctionExpression
扱い、Opera と Chrome はそれを として扱いFunctionDeclaration
ます。
私の質問は、Firefox の動作が異なるのはなぜですか? どちらの実装がより論理的ですか? 規格に準拠しているのはどれですか?
JavaScript の宣言は巻き上げられることを理解しています。そのため、同じ関数が同じスコープ内の 2 つ以上の異なるブロックで宣言されている場合、名前の競合が発生します。
ただし、次のようなことができるように、関数が宣言されるたびに関数を再宣言する方が論理的ではないでしょうか。
これは、上で説明したブロックのスコープの問題を解決することに加えて、非常に役立つと思います。
javascript - 厳密モードの関数式内で定義された変数のスコープは何ですか?
私が理解しているように、変数が定義されると、それは。を介して「最も近い」ローカルスコープにアタッチされますthis
。
ローカルにスコープが設定されていない場合、最も近いスコープはになりwindow
ます。
ただし、厳密モードでは、グローバルスコープの誤用を制限するように設計されたECMAscript 5仕様の一部としてwindow
、ローカルスコープがではなく未定義に設定されます。
jQueryプラグインを作成するための即時呼び出し関数式パターンと厳密モードの使用
ローカルスコープ(コンテキスト)は(関数呼び出しを介して)作成されないため、未定義に設定されます。
ローカルスコープが未定義で未定義の場合window.myVar
、変数のスコープは何myVar
ですか?また、どのようにアクセスしますか?
javascript - 名前付き関数式を使用する理由
JavaScriptで関数式を実行するには、次の2つの方法があります。
名前付き関数式(NFE):
匿名関数式:
そして、それらの両方をで呼び出すことができますboo();
。匿名関数を使用する理由とタイミング、および名前付き関数式を使用するタイミングが本当にわかりません。それらの間にはどのような違いがありますか?
javascript - これはどのように機能していますか !function(){console.log("hi")}()
私はjavascriptの庭のサイトでこれを読みました。誰かがそれがどのように機能するか説明できますか?