タグ付けされた質問 「closures」

クロージャは、それが定義されたスコープの変数を参照する(閉じる)ファーストクラスの関数です。定義されたスコープが終了した後もクロージャーがまだ存在する場合、クローズする変数も存在し続けます。

30
JavaScriptクロージャーはどのように機能しますか?
この質問の答えはコミュニティの努力です。この投稿を改善するには、既存の回答を編集してください。現在、新しい回答や相互作用を受け入れていません。 OverаэтотвопросестьответынаStack Overflowнарусском:КакработаютзамыканиявJavaScript JavaScriptクロージャの構成概念(関数、変数など)を知っている人に、JavaScriptクロージャをどのように説明しますか?しかし、クロージャ自体は理解していませんか? WikipediaにあるSchemeの例を見たことがありますが、残念ながら役に立ちませんでした。

30
ループ内のJavaScriptクロージャー–簡単で実用的な例
OverаэтотвопросестьответынаStack Overflowнарусском:Почемуасинхроннаяфункциявнутрициклавыполнанеренененерененеренетерет var funcs = []; // let's create 3 functions for (var i = 0; i < 3; i++) { // and store them in funcs funcs[i] = function() { // each should log its value. console.log("My value: " + i); }; } for (var j = 0; j …

26
Pythonラムダが役立つのはなぜですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 私はPythonラムダを理解しようとしています。ラムダは、現実には忘れておくべき「興味深い」言語アイテムの1つですか? 私はそれが必要になるかもしれないいくつかのエッジケースがあると確信していますが、それが曖昧であること、将来のリリースで再定義される可能性(私のさまざまな定義に基づく私の仮定)、およびコーディングの明快さの低下-それがあれば避けられる? これは、C型のオーバーフロー(バッファオーバーフロー)を思い出します。つまり、最上位の変数をポイントし、他のフィールド値を設定するためにオーバーロードしています。それは一種の技術者のショーマンシップのように感じますが、メンテナンスコーダーの悪夢です。



12
JavaScriptクロージャーと無名関数
私の友人と私は現在、JSの閉鎖とは何か、閉鎖ではないことについて話し合っています。本当に正しく理解できるようにしたいだけです。 この例を見てみましょう。カウントループがあり、遅延したコンソールにカウンター変数を出力したいと考えています。したがってsetTimeout、クロージャーを使用してカウンター変数の値をキャプチャし、値NのN倍を出力しないようにします。 クロージャーまたはクロージャーに近いものがない場合の間違った解決策は次のとおりです。 for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); } もちろんi、ループ後の値の10倍、つまり10を出力します。 それで彼の試みは: for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); } 期待どおりに0〜9を印刷します。 私は彼がキャプチャにクロージャーを使用していないと彼に話しましたi、しかし彼は彼がそうであると主張します。私は、forループ本体を別の内部に配置して(無名関数をに渡す)、再度10回10を出力することによって、クロージャーを使用しないことを証明しました。彼の関数をaに保存し、ループの後に実行した場合も同じことが当てはまります。10を10回出力します。したがって、私の議論は、彼がの値を実際にキャプチャしておらず、バージョンをクロージャーではないということです。setTimeoutsetTimeoutvari 私の試みは: for(var i = 0; i < 10; …


6
PHPでは、クロージャーとは何ですか。なぜ「使用」識別子を使用するのですか。
私はいくつかのPHP 5.3.0機能をチェックしていて、サイト上でかなり面白いと思われるコードに遭遇しました: public function getTotal($tax) { $total = 0.00; $callback = /* This line here: */ function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($this->products, $callback); return round($total, 2); } 無名関数の例の1つとして。 誰かこれについて知っていますか?ドキュメントはありますか?そして、それは悪そうに見えます、それを使うべきですか?
407 php  closures 

10
このJavaScriptイディオムの根底にあるものは何ですか?var self = this?
WebKit HTML 5 SQL Storage Notes Demoのソースで以下を確認しました。 function Note() { var self = this; var note = document.createElement('div'); note.className = 'note'; note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false); note.addEventListener('click', function() { return self.onNoteClick() }, false); this.note = note; // ... } 著者は自分自身をいくつかの場所(関数本体)で使用し、これを他の場所(メソッドの引数リストで定義された関数の本体)で使用します。どうしたの?一度気づいた今、どこでも見始めますか?


3
変更されたクロージャーへのアクセス
string [] files = new string[2]; files[0] = "ThinkFarAhead.Example.Settings.Configuration_Local.xml"; files[1] = "ThinkFarAhead.Example.Settings.Configuration_Global.xml"; //Resharper complains this is an "access to modified closure" for (int i = 0; i < files.Length; i++ ) { // Resharper disable AccessToModifiedClosure if(Array.Exists(Assembly.GetExecutingAssembly().GetManifestResourceNames(), delegate(string name) { return name.Equals(files[i]); })) return Assembly.GetExecutingAssembly().GetManifestResourceStream(files[i]); // ReSharper restore AccessToModifiedClosure } …
316 c#  resharper  closures 

21
Javaの関数ポインターの最も近い代替物は何ですか?
約10行のコードを使用するメソッドがあります。コードの1行を変更する小さな計算を除いて、まったく同じことを行うメソッドをさらに作成したいと思います。これは関数ポインターを渡してその1行を置き換えるのに最適なアプリケーションですが、Javaには関数ポインターがありません。私の最善の選択肢は何ですか?

22
JavaScriptでのクロージャの実用的な用途は何ですか?
私はよしようとして JavaScriptの閉鎖のまわりで私の頭をラップするために、私の一番を。 内部関数を返すことで、直接の親で定義されている変数にアクセスできるようになります。 これはどこで役に立ちますか?たぶん、まだ頭が十分ではありません。私がオンラインで見た例のほとんどは、実際のコードを提供しておらず、あいまいな例を提供しています。 誰かが私にクロージャの実際の使用を見せてくれますか? これは、例えば? var warnUser = function (msg) { var calledCount = 0; return function() { calledCount++; alert(msg + '\nYou have been warned ' + calledCount + ' times.'); }; }; var warnForTamper = warnUser('You can not tamper with our HTML.'); warnForTamper(); warnForTamper();

7
Pythonの入れ子関数がクロージャと呼ばれないのはなぜですか?
私はPythonでネストされた関数を見て使用しましたが、それらはクロージャーの定義と一致しています。では、なぜnested functions代わりに呼び出されるのclosuresですか? ネストされた関数は外部の世界で使用されていないため、クロージャーではありませんか? 更新:クロージャーについて読んでいて、Pythonに関するこの概念について考えさせられました。以下のコメントで誰かが言及している記事を検索して見つけましたが、その記事の説明が完全に理解できなかったため、この質問をしました。

6
(ラムダ)関数クロージャは何をキャプチャしますか?
最近、私はPythonをいじり始めましたが、クロージャーが機能する方法に変わったものを見つけました。次のコードを検討してください。 adders=[0,1,2,3] for i in [0,1,2,3]: adders[i]=lambda a: i+a print adders[1](3) これは、単一の入力を受け取り、その入力を数値で追加した関数を返す単純な配列を作成します。関数はforループで構築され、イテレータiはから0まで実行され3ます。これらの数値のそれぞれに対して、lambda関数を作成iして関数の入力に追加する関数が作成されます。最後の行は、パラメーターとして2番目のlambda関数を呼び出し3ます。驚いたことに、出力はでした6。 期待していました4。私の推論は:Pythonではすべてがオブジェクトであり、したがってすべての変数はオブジェクトへのポインターとして不可欠です。のlambdaクロージャーを作成するときにi、が現在ポイントしている整数オブジェクトへのポインターを格納することを期待していましたi。つまりi、新しい整数オブジェクトが割り当てられた場合、以前に作成されたクロージャーには影響しません。悲しいことに、addersデバッガー内で配列を検査すると、配列がそうであることがわかります。すべてlambdaの関数は最後の値を参照してくださいi、3で、その結果adders[1](3)を返します6。 次のことについて不思議に思います: クロージャは正確に何をキャプチャしますか? lambda現在の値をキャプチャして、値を変更してiも影響を受けないように関数を説得する最もエレガントな方法は何iですか?
249 python  lambda  closures 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.