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

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

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

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

Q&A

2回答

1271閲覧

どうしてクロージャーになるのか

aaaaaaaa

総合スコア501

JavaScript

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

0グッド

1クリップ

投稿2016/10/27 10:50

javascript

1function Human(name) { 2 this.name = name; 3} 4function greet(arg1, arg2) { 5 console.log(arg1 + this.name + arg2); 6} 7var mike = new Human("Mike"); 8var greetMorning = greet.bind(mike); 9greetMorning("Good Morning","!");

上記のソースは、bind内の引数を束縛し新しい関数を返します。またその新しい関数は、クロージャーだそうです。
ということは、その新しい関数として返されるgreetは、クロージャーになりますが、元々のgreetは、クロージャーではありません。
新しく返される関数になるとクロージャーになるのでしょうか。その場合、greet関数は、エンクロージャーとして扱われますか、それともクロージャーとして扱われますか。
greetそのものがクロージャーとして扱われる場合、どのような名称、機能をもったオブジェクトに囲われるのでしょうか。

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

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

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

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

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

guest

回答2

0

Funcrion.prototype.bind はクロージャではない

Funcrion.prototype.bind を使用しても greet はエンクロージャにはならないと思います。
クロージャとは関数内包の事です。
入れ子になっていない関数をクロージャと呼びません。
それはクロージャと似て非なるものです。

Funcrion.prototype.bind は Polyfill を作れない

Funcrion.prototype.bindthis 値の扱いが難しいので Polyfill コードを書くことが出来ません。
ですので、疑似コードでそれを語るのはナンセンスだと思います。

new 演算子の挙動を度外視するなら上記ブログで Constellation さんが書いたように Polyfill を書くことが可能です。
が、ネイティブな Funcrion.prototype.bind と同一ではない事に変わりはありませんので、内部仕様を理解した上で「クロージャとの共通点」「クロージャとの相違点」を見出す必要があります。

何となく全体像を把握するのが目的であれば「Funcrion.prototype.bind はthis束縛、引数束縛する関数」と認識するのが無難だと思います。
クロージャは忘れてください。

Re: aaaaaaaa さん

投稿2016/10/27 11:29

編集2016/11/11 17:52
think49

総合スコア18156

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

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

aaaaaaaa

2016/11/11 10:39

ご回答有難うございます。つまり、greetは、包む側ではなく、包まれる側ということですね。 新しい関数として生まれた後は、pinpikokun氏が提示したソースのようになるということでしょうか。
think49

2016/11/11 17:38

包むとか包まれるとかではなく、完全にクロージャと別個の存在と認識した方が無難と考えます。親記事を編集しました。
aaaaaaaa

2016/11/15 11:00

ご返答有難うございます。 たびたび、注意を貰っているパーフェクトjavascript 185pからの受け売りだったのですが 違うもの、と考えなければならないのですね。 ポリフィルというのを初めて聞いたのですが、 古い型のブラウザ、新しいブラウザに対応していない機能を追加し、穴をうめることを意味する単語(http://keicode.com/script/what-is-polyfill.php)だと知りました。bindは、thisの扱いが難しいので穴を埋めることができない、ということでしょうか。
guest

0

bindした時点で以下のようになると考えれば納得いきませんか

javascript

1var greetMorning = (function (arg){ 2 var this = arg; 3 return function greet(arg1, arg2) { 4 console.log(arg1 + this.name + arg2); 5 } 6})(mike);

投稿2016/10/27 11:19

編集2016/10/27 11:28
pinpikokun

総合スコア376

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

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

aaaaaaaa

2016/11/11 10:38

ご回答有難うございます。なるほど、bindして新しく作られた関数は、ご提示してくださったソースのようになるということですね。確かにナイホウしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問