[解決済み] javascript: 再帰的匿名関数?
質問
基本的な再帰的関数があるとします。
function recur(data) {
data = data+1;
var nothing = function() {
recur(data);
}
nothing();
}
無名関数がある場合、どのようにすればよいのでしょうか...
(function(data){
data = data+1;
var nothing = function() {
//Something here that calls the function?
}
nothing();
})();
この関数を呼び出した関数を呼び出す方法が欲しいのですが・・・。呼び出された関数の名前を教えてくれるスクリプトをどこかで見たことがあるのですが(どこかは思い出せません)、今はその情報を思い出せません。
どのように解決するのですか?
あなたは できる 関数を "関数宣言" 文ではなく値として作成しているときでも、関数に名前を付けることができます。つまり
(function foo() { foo(); })();
はスタックブロウな再帰関数です。 さて、そうは言っても、あなたは
はおそらく
はやりたくないかもしれません。
は、Javascriptの様々な実装に奇妙な問題があるため、一般的には行わない方が良いでしょう。(
ノート
- はかなり古いコメントです。Kangax のブログ記事で説明されている問題のいくつか/多く/すべては、よりモダンなブラウザでは修正されているかもしれません)。
このような名前を付けると、その名前は関数の外からは見えません (まあ、見えるはずもないのですが。これは奇妙な点の 1 つです)。 これは Lisp における "letrec" のようなものです。
に関しては
arguments.callee
に関しては、それは "strict" モードで禁止されており、いくつかの最適化を困難にするため、一般に悪いことと考えられています。 また、期待されるよりもずっと遅いです。
編集
- 自分自身を呼び出すことができる "anonymous"関数の効果を持ちたい場合、次のようにすることができます(関数をコールバックか何かとして渡していると仮定して)。asyncThingWithCallback(params, (function() {
function recursive() {
if (timeToStop())
return whatever();
recursive(moreWork);
}
return recursive;
})());
これは何をするかというと、素敵で安全で壊れないIEで関数を定義することです 宣言 ステートメントで関数を定義し、その名前がグローバルな名前空間を汚染しないローカル関数を作成します。ラッパー(本当に匿名)関数は、そのローカル関数を返すだけです。
関連
-
JavaScriptの関数この指摘の問題を説明
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
vue ディレクティブ v-html と v-text
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
Javascript Bootstrapのグリッドシステム、ナビゲーションバー、ローテーションの説明
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
nullのプロパティinnerHTMLを読み取れません エラーメッセージ
-
JavaScriptのgetElementById()メソッド入門