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

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

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

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

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

3回答

1744閲覧

AngularJS?JavaScript?のコード

color

総合スコア90

JavaScript

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

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

0クリップ

投稿2017/10/31 07:51

以下の様に返り値が二つ続いているんですけど、
意味が理解出来ず、ご説明や参考サイトをご紹介頂ければ幸いです。
※return に無名関数とthisがかっこ続きで書いていて??になってます。

javascript

1 $scope.showLoadingInvisible = (function(_this) { 2 return function() { 3 return $.blockUI({ 4 message: '', 5 overlayCSS: { 6 textAlign: 'center', 7 backgroundColor: '#fff', 8 opacity: 0.0, 9 cursor: 'wait', 10 zIndex: 2000 11 }, 12 verticalAlign: 'top' 13 }); 14 }; 15 })(this);

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

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

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

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

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

guest

回答3

0

ベストアンサー

外側から順を追って考えていきましょう。

JavaScript

1(function(_this) { 2 })(this)

これは「即時関数」といいます。もっと分解しましょう。やっていることはこれと同じです。これならわかりますか?

JavaScript

1var f = function(_this) { // 無名関数をfに代入 2 console.log(_this); 3}; 4f(this); // 無名関数fの引数にthisを渡す

ではこの一番外側の即時関数をAとしましょう。次にこのAが何を返すかを見てみましょう。

JavaScript

1return function() { 2};

またしても無名関数を返します。これをBとしましょう。外側の即時関数は戻り値として無名関数を返すようです。では更に内側を見て見ましょう。

JavaScript

1return $.blockUI({ 2 message: '', 3 overlayCSS: { 4 textAlign: 'center', 5 backgroundColor: '#fff', 6 opacity: 0.0, 7 cursor: 'wait', 8 zIndex: 2000 9 }, 10 verticalAlign: 'top' 11});

私はAngularJSに詳しくないのですが、blockUIというプラグインのインスタンスを返しているようですね。これをCとしましょう。

つまりこの処理が何をしているかをまとめると…

  • $scope.showLoadingInvisibleが欲しいのは引数無しの無名関数Bで、その無名関数を実行するとCのようなプラグインのインスタンスが返ってくることを望んでいる
  • Aでthisを_thisという一時変数として受け取っておくことで、BやCで_thisを使って外側のthisインスタンスにアクセスが可能…だがこのコードでは_thisを使っていないのでAで囲む意味はない

投稿2017/10/31 08:24

masaya_ohashi

総合スコア9206

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

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

color

2017/11/01 03:44

ありがとう御座います。一番わかりやすかったのでベストアンサーに選ばせて頂きました。 大変ありがとう御座いました。
guest

0

上級者が使うthisの保存テクです。
(今回のコードでは_thisを使ってないので無意味ですが)

JavaScript

1var obj = { 2 item: 'リンゴ', 3 look: function () {return this.item} 4}; 5 6console.log(obj.look()); 7// リンゴ <- 当然 8 9var look = obj.look; // 一回保存しておこうっと 10console.log(look()); 11// undefined <- あれれ、取れなくなったぞ?

質問文のテクを使ってみましょう

JavaScript

1var obj = { 2 item: 'リンゴ', 3 look: (function(_this){return function(){return _this.item}})(obj) 4}; 5 6console.log(obj.look()); 7// リンゴ 8 9var look = obj.look; // 一回保存しておこうっと 10console.log(look()); 11// リンゴ

今回は同じスコープにあるobj.itemを参照したかったので、
少し事情が違いますがobjをバインドさせておきました。

このようにJavaScriptは関数の戻り値として関数を返せます。
その時に外の関数で利用した引数を保持させておいて、内部の関数で利用することが可能です。

投稿2017/10/31 09:09

miyabi-sun

総合スコア21158

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

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

0

JavaScriptは変数に関数を格納することができるという特徴があり、この特性により、CやJAVAのプログラマはまず確実に読めないコードに出くわします。
これもそのパターンです。慣れれば読み解けますがかなりしんどいですね。

以下のように整形すると少し読み易くなると思います。返り値や引数に関数が設定されていることがポイントです。

JavaScript

1 2var func1 = function(_this) { 3 return func2; 4}; 5 6var func2 = function() { 7 return func3(); 8}; 9 10var func3 =function(){ 11 return $.blockUI({ 12 message: '', 13 overlayCSS: { 14 textAlign: 'center', 15 backgroundColor: '#fff', 16 opacity: 0.0, 17 cursor: 'wait', 18 zIndex: 2000 19 }, 20 verticalAlign: 'top' 21 }); 22}; 23 24$scope.showLoadingInvisible = (func1(_this))(this); 25

上記コードで説明するとまず$scope.showLoadingInvisibleはfunc1を実行します。func1はfunc2を返却しますが、返却された際はまだ実行されません。

恐らく$scope.showLoadingInvisibleを実行した側でfunc2を受け取って、任意のタイミングで実行するのでしょう。
func2を実行すると、$.blockUIが実行され、結果が取得できます。

私自身も、完全に読み解けているか自信が有りません。
もし記載に誤りなどございましたらご指摘下さい。

投稿2017/10/31 08:20

akabee

総合スコア1947

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問