質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

Q&A

解決済

2回答

2049閲覧

リファクタリングとクロージャがうまくできません。

azxsedcvfr

総合スコア12

JavaScript

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

リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

0グッド

1クリップ

投稿2016/04/14 06:37

###前提・実現したいこと
JavaScriptのリファクタリングを勉強していたら、分からなくなりました。

問題点は
function priorityColorChange と function moveItem を
function addItemの中から出したいのですが、出すと変数itemが取れなくなります。

シンプルなto do リストのコードです。
プログラミング入門者なので、質問が下手かも知れませんが、助けていただけると嬉しいです。

###発生している問題・エラーメッセージ
問題点は
function priorityColorChange と function moveItem を
function addItemの中から出したいのですが、出すと変数itemが取れなくなります。

###該当のソースコード ```JavaScript window.addEventListener('load', init); function init () { var okBtn = document.getElementById('btn'); okBtn.addEventListener('click', addItem); } function addItem(){ var task = document.getElementById('task'); var priority = document.getElementById('priority'); var taskList = document.getElementById('taskList'); var doneList = document.getElementById('doneList'); var item = document.createElement('li'); var deleteBtn = document.createElement('button'); var priorityClone = priority.cloneNode(true); var color; deleteBtn.innerHTML = 'delete'; item.innerHTML = task.value; item.style.color = getColor(priority.value); item.appendChild(priorityClone); item.appendChild(deleteBtn); taskList.appendChild(item); priorityClone.addEventListener('change', priorityColorChange); function priorityColorChange (event) { item.style.color = getColor(event.target.value); } deleteBtn.addEventListener('click', moveItem); function moveItem (){ taskList.removeChild(item); item.removeChild(priorityClone); item.removeChild(deleteBtn); doneList.appendChild(item); } } function getColor(value) { switch ( Number(value) ) { case 1: return '#f62'; case 2: return '#fc0'; case 3: return '#0af'; } }

###試したこと
クロージャで解決できるというところまでは、調べて分かったのですが
このコードにどうやって適用できるのかが、いろいろ試してみたのですが分かりませんでした。
大変初歩的な問題だと思うのですが、どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

function addItem(){ var task = document.getElementById('task'); var priority = document.getElementById('priority'); var taskList = document.getElementById('taskList'); var doneList = document.getElementById('doneList'); var item = document.createElement('li'); var deleteBtn = document.createElement('button'); var priorityClone = priority.cloneNode(true); var color; deleteBtn.innerHTML = 'delete'; item.innerHTML = task.value; item.style.color = getColor(priority.value); item.appendChild(priorityClone); item.appendChild(deleteBtn); taskList.appendChild(item); priorityClone.addEventListener('change', priorityColorChange); var a1 = function priorityColorChange (event) { item.style.color = getColor(event.target.value); } deleteBtn.addEventListener('click', moveItem); var a2 = function moveItem (){ taskList.removeChild(item); item.removeChild(priorityClone); item.removeChild(deleteBtn); doneList.appendChild(item); } // ここで出してしまう。これがクロージャ。 return { priorityColorChange:a1, moveItem:a2 } }

returnによって関数を外だしします。
すると

item = addItem() item.moveItem()

のように呼べるようになり、かつクロージャなので、itemにはアクセス可能です。

投稿2016/04/14 06:50

sokha

総合スコア216

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

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

0

javascript

1priorityClone.addEventListener('change', priorityColorChange); 2 3function priorityColorChange (event) { 4 item.style.color = getColor(event.target.value); 5}

↑この部分、

javascript

1priorityClone.addEventListener('change', priorityColorChange(item));

javascript

1var priorityColorChange = function(item){ 2 return function(event) { 3 item.style.color = getColor(event.target.value); 4 } 5}

↑こんな風にすれば外だしできますね。

投稿2016/04/14 06:45

tkturbo

総合スコア5572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問