掲題の通りです。
JavaScript
1promise() 2 .then((response) => console.log(response));
上記が成功するのはわかります。
JavaScript
1promise() 2 .then(console.log);
これだと、結果受け取っていないように思われるため、どうして成功するのかわかりません。
これがどのような省略記法なのか、教えていただきたいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
promise().then(fn)
は、Promiseインスタンスのthenメソッドの実行という意味です。
thenメソッドを実行する時は、引数に関数を指定して下さいねと言っています。
つまり、引数を要求する関数を渡せば何でもいいんですよ。
まず、JSでは関数を第一級オブジェクトとして取り扱っている為、以下の特性があります。
- 変数に代入できる
- 関数の引数として設定できる
- 関数の戻り値として設定できる
console.logはConsoleというインスタンスで、プロトタイプメソッドとしてlogがぶら下がっています。
このメソッドはthisがconsoleインスタンスに束縛されているだけの関数です。
関数やメソッドはお尻に()
をつける事で実行されます。
console.log
のようにカッコを付けずにアクセスすることで、
関数の実体にアクセスすることが可能です。
関数としてアクセスしたメソッドは、代入演算子で変数に格納したり、
別の関数やメソッドの引数として利用することが可能です。
例としてArray.prototype.forEach
にconsole.logを千切って渡してみましょう。
JavaScript
1[1, 2, 3].forEach(console.log); 2// 1 0 (3) [1, 2, 3] 3// 2 1 (3) [1, 2, 3] 4// 3 2 (3) [1, 2, 3]
forEachはコールバック関数に対して「要素の値、インデックス値、配列そのもの」を引数として渡すので、可変引数のconsole.log
を渡すと出力結果が大騒ぎになりますが、普通に動作している事が分かります。
console.logは別にthisに強く依存する作りではないので、
メソッドを千切ってコールバック引数として指定するだけでも動作します。
ただし、インスタンスのメソッドは基本的にthis、つまりプロパティに依存するものが多いはず。
プロパティに依存しないなら最初から静的メソッドや普通の関数で作るケースが多いですからね。
ちょっと変数にメソッドを千切って保存することで、
thisの束縛が切れてしまうことを確認してみましょう。
JavaScript
1class Cat { 2 constructor (name) { 3 this.name = name; 4 } 5 say () { 6 return `${(this || {}).name}: meow`; 7 } 8} 9 10const tama = new Cat('tama'); 11console.log(tama.say()); // tama: meow 12 13const say = tama.say; 14console.log(say()); // Undefined: meow
鳴き声say
のプロトタイプメソッドだけ保存しておこうと別の変数に保存すると、
見事に捨て猫になってしまいました。
無名関数に包むのが楽ですが、bindを使ったり、引数に束縛したりと色々と対応策はあります。
JavaScript
1// 対応策色々 2const say2 = tama.say.bind(tama); 3const say3 = () => tama.say(); 4const say4 = (cat => () => cat.say())(tama); 5 6console.log(say2()); // tama: meow 7console.log(say3()); // tama: meow 8console.log(say4()); // tama: meow
ここの部分は難解で質問文時点では蛇足気味ですが、
JSで高度な処理を組む時にシンプルに書けるようになってくるので必要に応じて勉強してみてください。
投稿2018/10/26 09:09
総合スコア21158
0
ベストアンサー
then()は、関数を受け取り、その関数にresponseをセットして呼び出すからだと思います。
〜.then(hoge)という呼び出しに対して、
Promiseの内部では、
hoge(response);
が呼び出されるということです。
一つ目の例を、
const func = (response) => {console.log(response)); promise.then(func);
と置きかえると、
func(response); //console.log(response);の呼び出し
が呼び出されることになり、
結果としては、質問の二つのソースは同じ意味になりますね。
投稿2018/10/25 23:52
総合スコア715
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/26 01:46
2018/10/26 03:55
0
コールバックしているだけですね
javascript
1["a","b","c"].forEach(console.log)
投稿2018/10/26 00:24
総合スコア114769
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/26 01:07
2018/10/26 01:52
2018/10/26 02:03
2018/10/26 03:05 編集
2018/10/26 02:27
2018/10/26 03:02
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/26 12:20 編集
2018/10/29 01:00
2018/10/29 08:25