例えば、test()から
console.log("sample2")を実行しない為に
働きかけることはできるのでしょうか?
もし、可能であればこの動作の名称を教えていただけると助かります。
よろしくお願いいたします。
javascript
1console.log("sample") 2test(); 3//↑戻り値で以下の処理続行可否を決めるのではなく 4//関数内で処理中断できないでしょうか? 5console.log("sample2") 6 7 8function test(){ 9 return //ここで処理を中断したい 10} 11 12
環境 windows 10 64bit
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
js
1console.log("sample"); 2test(); 3console.log("sample2");//動作しない 4console.log("sample3");//動作する 5 6 7function test(){ 8 let temp = console.log; 9 console.log =function(){console.log = temp}; 10 //console.log を捨てたので、次の1回は動作しない。その次からは戻されるので動作する。 11}
投稿2018/02/28 11:04
総合スコア37426
0
そんな強制終了のようなものはロジックがおかしいと思いますが
あえてやるならtry-catchで例外をthrowするとかでしょうか
javascript
1try{ 2 console.log("sample"); 3 test(); 4 console.log("sample2"); 5}catch(e){ 6 7} 8function test(){ 9 throw 1; 10}
投稿2018/02/28 10:11
総合スコア117682
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
throw 文
それがエラーであるなら、エラーメッセージを出力して強制終了させることは可能です。
JavaScript
1function test () { 2 throw new Error('fooはbarでなければなりません'); 3}
例外キャッチか戻り値判定の2択なのですね。
x_x さんが仰るように、try-catch は使用しません。
throw はエラーをコンソールに出力してその場で即座に強制終了する為の機構です。
JavaScript には「不正な引数であった場合に強制終了する仕組み」があります。
JavaScript
1(2).toString(-1); // RangeError: toString() radix argument must be between 2 and 36
return 文
エラーでないのなら、返り値から判断して return
文で終了させるか、
JavaScript
1(function () { 2 console.log("sample"); 3 4 var resutl = test(); 5 6 if (!result) { 7 return; 8 } 9 10 console.log("sample2"); 11}());
返り値から後述コードを条件付き実行にするのが正しいアプローチだと思います。
JavaScript
1(function () { 2 console.log("sample"); 3 4 var resutl = test(); 5 6 if (result) { 7 console.log("sample2"); 8 } 9}());
Re: deep さん
投稿2018/02/28 11:09
編集2018/03/01 07:30総合スコア18194
0
不可能です。
どのくらい突飛な事をやろうとしているのか、別のモノで例えてみます。
最近妻(夫)が浮気してるような気がする。
探偵に頼もう(test関数)実行。
しばらくして探偵から連絡がありました。
探偵「いやあ、どうやら貴方の配偶者は浮気してたみたいなんで勝手に裁判してきました。これが和解金です。いやあ相場より若干少なかったですね。」
これくらい酷いことをやってます。
依頼を受けた探偵(test関数)が出来るのは、
依頼主に「貴方の配偶者は浮気してましたよ or 浮気してませんでしたよ」という結果を返すだけです。
それを元にどういう行動すべきかを自分で決めて下さい。
まぁ、JavaScriptならではの抜け道は色々とありますので考えていきます。
しかしtest関数
の戻り値で今後の動作を決めるのが最も最適解ということは忘れないでください。
- 例外をスローして後続の処理を殺す
- 関数の外から変数を弄る
- オブジェクトの参照を渡して中から弄る
- 処理が成功した時に実行してほしいものを引数として渡す
1個目: 例外スローはyambejpさんの案です。
2個目: 関数の外から変数を弄る
この書き方は外の変数に依存するので使い勝手が非常に悪いです。
それとコードを見れば分かりますが、
いつの間にかflags.test
の値がfalseになったのかコードからは中々読み取れません。
従ってこういう書き方を多くの場面でやっているプロジェクトは技術的負債で進捗が大幅に遅延することになります。
JavaScript
1var main = function () { 2 var flags = { 3 test: true 4 } 5 var test = function () { 6 // このように関数スコープの外にある変数には自由にアクセスできます 7 flags.test = false; 8 } 9 console.log("sample"); 10 test(); 11 if (flags.test) return; // 質問文的にこの1行が抜けないのであまり意味なし? 12 console.log("sample2"); 13} 14main();
3個目: オブジェクトの参照を渡して中から弄る
ダサいですがありって感じですかね。
これもflags.testが勝手に書き換わるのが何処かは分かりかねますが、
testの引数がflagsを欲しがっている事が分かるので、まだ推測し易いと言えるでしょう。
JavaScript
1var test = function (flags) { 2 // 引数がオブジェクトや配列の場合参照渡し(※)になるので中から値を弄って変えられる 3 flags.test = false; 4} 5var main = function () { 6 var flags = { 7 test: true 8 } 9 console.log("sample"); 10 test(flags); 11 if (flags.test) return; // 質問文的にこの1行が抜けないのであまり意味なし? 12 console.log("sample2"); 13} 14main();
4個目: 成功した時に今後やりたい動作を関数として定義してやる
ちょっとトリッキーですが、これは多くのオブジェクト指向言語のDIコンテナに似た解決方法です。
JavaScriptは言語仕様的に関数が第一級オブジェクトなので、
配列等と同様に変数に格納・引数に設定・戻り値として返す事が可能です。
上級者が質問文の条件で何とかやれと言われたら、
testに関数を引数としてよこすようにし、こういう形で解決を目指すことになるかと思います。
JavaScript
1// 関数を引数にセットできる 2var test = function (cb) { 3 // 条件を満たしたときのみコールバック関数を実行 4 if (true) { 5 cb(); 6 } 7} 8var main = function () { 9 console.log("sample"); 10 test(function () { 11 console.log("sample2"); 12 }); 13} 14main();
投稿2018/02/28 10:46
編集2018/02/28 11:07総合スコア21400
0
console.log("sample"); test(); console.log("sample2"); function test() { console.log('test'); fadoijafjoafjeoifdafafafaf!!! //ここがポイント }
投稿2018/02/28 11:10

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/28 11:23 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/28 11:09
2018/02/28 11:35