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

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

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

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

Q&A

解決済

5回答

1730閲覧

独自定義関数から処理を中断するには?

deep

総合スコア20

JavaScript

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

0グッド

3クリップ

投稿2018/02/28 10:05

例えば、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ページで確認できます。

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

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

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

guest

回答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

Lhankor_Mhy

総合スコア35869

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

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

miyabi-sun

2018/02/28 11:09

こ、これは凄い解決方法だ……
deep

2018/02/28 11:35

トリッキーな方法ありがとうございます。 驚きました。。
guest

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

yambejp

総合スコア114583

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

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

deep

2018/02/28 11:33

戻り値で後続するか判定するのは 複数のtest()呼び出し元がある場合に コードを追加するのが少し面倒だと感じたので 後続しない場合、関数内で処理を完結できたらと思い 質問させていただきました。 この考え方はロジック的に問題がありますでしょうか?
guest

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
think49

総合スコア18156

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

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

deep

2018/02/28 11:39

例外キャッチか戻り値判定の2択なのですね。 ありがとうございます。
x_x

2018/02/28 13:08

think49さんの意図はわかりませんがキャッチはしていないのでは? 例外で終了です。
think49

2018/03/01 07:27

親記事に追記しました。
guest

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
miyabi-sun

総合スコア21158

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

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

deep

2018/02/28 11:35

メインフローで戻り値判定するのが一番のようですね。 分かりやすいご解説ありがとうございます。
guest

0

console.log("sample"); test(); console.log("sample2"); function test() { console.log('test'); fadoijafjoafjeoifdafafafaf!!! //ここがポイント }

投稿2018/02/28 11:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

miyabi-sun

2018/02/28 11:23 編集

SyntaxErrorで最初のconsole.logも発火しませんでした こんな感じに修正してみましたのでご査収の程よろしくお願いします。 console.log("sample"); test(); console.log("sample2"); function test() {  console.log('test');  eval('fadoijafjoafjeoifdafafafaf!!!'); //ここがポイント }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問