2017-12-12 7 views
1

もともとは匿名関数であった関数を呼び出すことを検討していますが、私のコードでこの関数が3回必要です。Javascriptの無名関数で関数を呼び出すときに "this"キーワードを使う方法は?

function saveButton() { 
 
    this.parentElement.parentElement.querySelector('h3').innerHTML = this.parentElement.querySelector('input[name="task-title"]').value; 
 
    this.parentElement.parentElement.querySelector('p').innerHTML = this.parentElement.querySelector('textarea').value; 
 
    this.parentElement.parentElement.querySelector('.popup').className = 'popup hidden'; 
 
    this.parentElement.parentElement.querySelector('.overlay').className = 'overlay hidden'; 
 
    saveWork(); 
 
};

は、私はこのような匿名関数でこの関数をコールする場合:

confirmButton.onclick = function() 
 
    saveButton(); 
 
};

しかし、その後 は、だから私はこのような関数を定義しました私は私がを使用することができなかったことに気づいた無名関数の。匿名機能でconfirmButton()に電話するにはどうすればよいですか?

+1

を汚染しない、スコープの深さの任意のレベルで使用することができ

var self = this; this.saveButton = function() { // or self.saveButton... this.parentElement.parentElement.querySelector('h3').innerHTML = this.parentElement.querySelector('input[name="task-title"]').value; this.parentElement.parentElement.querySelector('p').innerHTML = this.parentElement.querySelector('textarea').value; this.parentElement.parentElement.querySelector('.popup').className = 'popup hidden'; this.parentElement.parentElement.querySelector('.overlay').className = 'overlay hidden'; saveWork(); }; confirmButton.onclick = function() { self.saveButton(); } 

をonclickを使用せず、コールバック内で動作する要素を公開するaddEventListenerを使用してください。 – charlietfl

+0

[この "キーワードの仕組みは?](https://stackoverflow.com/questions/3127429/how-does-the -this-keyword-work) – Michael

答えて

2
confirmButton.onclick = saveButton; 

または

confirmButton.onclick = function(){ 
    saveButton.call(this); 
}; 

それは、DOMノードと呼び出したい関数に同じ名前を持つことをお勧めしませんが。いくつかのことをあなたが投稿コードの断片を見て、と推測してbuttonClick

+0

どちらも「this」は定義されていません。 2番目のスニペットで、私は 'confirmButton()を書いた。call(this);'これはあなたが意味するものだと思う。そして、はい、私は自分の機能の名前を変更することを考えます。 (私は別の場所で同じことをしています) –

+0

あなたは何かにあなたの関数の名前を変更しましたか?今すぐconfirmButton DOMノードがconfirmButton関数によって上書きされるか、またはその逆のようになります – fila90

+0

私の関数の名前を –

0

ような、より理にかなって何かにあなたの関数の名前を変更し、私は次のリファクタリングお勧め:たぶん

function saveButton(parentElem) { 
    var myParent = parentElem || this.parentElement; 
    myParent.parentElement.querySelector('h3').innerHTML = myParent.querySelector('input[name="task-title"]').value; 
    myParent.parentElement.querySelector('p').innerHTML = myParent.querySelector('textarea').value; 
    myParent.parentElement.querySelector('.popup').className = 'popup hidden'; 
    myParent.parentElement.querySelector('.overlay').className = 'overlay hidden'; 
    saveWork(); 
} 

confirmButton.onclick = function() { 
    // I suppose when this function is called somewhere else, 
    // you actually know who is the parent element, so: 
    saveButton(document.querySelector('.theParentElement')); 
}; 

// If you calling it somewhere where "this" is available, 
// then simply call the function with no arguments: 
saveButton(); 

のいくつかのバリエーションを上記の例はあなたを助けることができます。それ以外にも、コードの大部分を見ることなく、より良い答えを考えることはできません。

+0

ではない。私はプレーンなJavascriptでHTML要素を生成しています。どこでも親要素でquerySelectorを使用することはできません。私は実際に新しく作成されたオブジェクトの親を選択する必要があります。これがプレーンなJavascriptで見つかった唯一の方法です。私のコードのどこか他の場所で、親要素を削除したい、それは醜いですが、 'parentElement.parentElement.removeChild(this.parentElement)'を実行する必要があります。... もう少し複雑です。しかし、私があなたを見せた数が少なかったので、あなたはそれを推測することができませんでした。 –

1

関数式を使ってみましたか? 基本的には、関数に変数を代入することを意味します。 thisを読むと、関数式と関数宣言の違いについて知ることができます。

はあなたが与えられた匿名関数の親スコープを使用したい:

は、あなたの質問については、ほとんどの時間、それは、この場合です。

場合厥、私はこの小ぎれいなトリックをお勧めしている場合:このトリックは、単にグローバル名前空間:)

関連する問題