🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

181閲覧

クリックイベントをまたぐ場合の変数の有効期限について(Deferred)

snyt45

総合スコア7

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/12/20 10:29

編集2019/12/20 11:31

知りたいこと

  • 動作ケース(B)のときには、なぜbtnAの変数が入った状態で使えるのでしょうか。
  • btnAでFormを送信して、そのときにFormという変数でFormオブジェクトを保持して、btnB(確認画面)で送信するボタンがあったとして、送信するボタンを押下した際に保持したFormオブジェクトを使用する用途で副作用などあったりするのでしょうか。

→ 2つ目の質問は一旦大丈夫です。必要だったら別で質問すると思います。

動作ケース(実例) ※coffeescriptで書いています。。

ボタンが2つあります。

<button type="button" id="btnA">Aボタン</button> <button type="button" id="btnB">Bボタン</button>

■(A)変数が使い回せないパターン
btnAを押すと、btnAという変数には値が入ります。
次に、btnBを押したときには、btnAはUndefinedになります。

$('#btnA') .click -> btnA = "ボタンAの変数だよ" console.log("Aを押したよ") $('#btnB') .click -> console.log("Bで押したよ" + btnA)

■(B)変数が使い回せるパターン
btnAを押すと、btnAという変数には値が入ります。
次に、btnBを押したときには、btnAは先程の値が入っています。

$('#btnA') .click -> btnA = "ボタンAの変数だよ" console.log("Aを押したよ") d = new $.Deferred() d.promise().then -> console.log("btnAの変数:" + btnA) $('#btnB').data('test', d) $('#btnB') .click -> d = $('#btnB').data('test') d.resolve()

■補足
いいタイトルが思い浮かばず、抽象的ですみません。

一応、下記もみて動作ケース(A)では動かないはわかりました。
https://teratail.com/questions/97163

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1つ目の質問についてのみ回答します。
2つ目の質問については、書かれていることがよくわからないので答えられません。実例を提示するか、わかりやすく書いてください。

coffeescript

1$('#btnA') 2 .click -> 3 # btnA のスコープはここから。 4 btnA = "ボタンAの変数だよ" 5 console.log("Aを押したよ") 6 # btnA のスコープはここまで。 7 8$('#btnB') 9 .click -> 10 console.log("Bで押したよ" + btnA) # btnA のスコープの外なので、btnA は使えない。

coffeescript

1$('#btnA') 2 .click -> 3 # btnA のスコープはここから。 4 btnA = "ボタンAの変数だよ" 5 console.log("Aを押したよ") 6 7 d = new $.Deferred() 8 9 d.promise().then -> 10 console.log("btnAの変数:" + btnA) # btnA のスコープの中なので、btnA は使える。 11 12 $('#btnB').data('test', d) 13 # btnA のスコープはここまで。 14 15$('#btnB') 16 .click -> 17 d = $('#btnB').data('test') 18 d.resolve()

詳しくは「クロージャ」等で検索すればいいと思います。

ちなみに、本題からそれますが、わざわざ Deferred を使う必要はないと思います。

coffeescript

1$('#btnA') 2 .click -> 3 btnA = "ボタンAの変数だよ" 4 console.log("Aを押したよ") 5 6 d = -> 7 console.log("btnAの変数:" + btnA) 8 9 $('#btnB').data('test', d) 10 11$('#btnB') 12 .click -> 13 d = $('#btnB').data('test') 14 d()

投稿2019/12/20 11:07

2KOH

総合スコア999

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snyt45

2019/12/20 11:48

2つ目の質問は一旦大丈夫です! 必要だったら別でまとめて質問しようと思います。 なるほど、btnAのスコープ内なので使えるんですね。 Deferredを使わない例も参考になります。 「クロージャ」というのですね、色々調べてみます!
guest

0

まちがえて回答してしまいました。無視してください。

投稿2019/12/20 11:46

編集2019/12/20 11:49
snyt45

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問