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

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

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

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

Q&A

2回答

386閲覧

javascriptでボックス化とは?callの使い方

Kimsehwa

総合スコア312

JavaScript

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

0グッド

1クリップ

投稿2019/03/11 12:19

以下はMDNドキュメントでapplyについて書いてる文章です。

non-strict mode 内の関数であれば、ここで渡した値が null もしくは undefined であった場合は
グローバル・オブジェクトに置き換えられ、プリミティブ型の変数はボックス化されます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

この文言についていくつか質問させてください。

質問1.

null もしくは undefined であった場合はグローバル・オブジェクトに置き換えられ

ここでいってる「グローバル・オブジェクト」はWindowのことでよろしいでしょうか?

thisの参照先を変更するためにcallを使うと思いますが、

obj.hoge.call(null,[1,2]);

だとobj.hoge([1,2]);と同じ動作かとお見ますが、認識合ってますか?

質問2.

プリミティブ型の変数はボックス化され

プリミティブ型の変数(数値・文字列・論理値・null・undefined)を入れるとブックス化されるらしいですが、
ボックス化ってなんでしょうか?
{}これのことでしょうか?

以上、よろしくおねがいします。

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

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

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

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

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

guest

回答2

0

ここでいってる「グローバル・オブジェクト」はWindowのことでよろしいでしょうか?

ブラウザではwindowじゃねーかな
場合によっては WorkerGlobalScope とかいうのにもなるし、globalとかいうのにもなる(Worker、Node.js)

obj.hoge.call(null,[1,2]);
だとobj.hoge([1,2]);と同じ動作かとお見ますが、認識合ってますか?

javascirpt

1{ 2const obj2 = {huga: 3}, hoge = function () { console.log(this); }; 3hoge.call(null, [1, 2]); 4hoge.call(window, [1, 2]); 5hoge.call(obj2, [1, 2]); 6}

ちな、アロー関数は自分ではthisもってねーからcallとかapplyは無効だろうな(しらんけど

ボックス化ってなんでしょうか?

https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E5%8C%96

ボックス化(boxing)[1]とは、プログラミング言語において値型をオブジェクト型(参照型)に変換すること。

つまり、プリミティブな値のラッパーオブジェクトが生成されるっつーことじゃねーかな

投稿2019/03/11 12:27

編集2019/03/11 12:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Function.prototype.apply

NOTE1: The thisArg value is passed without modification as the this value.
This is a change from Edition 3, where an undefined or null thisArg is replaced with the global object and ToObject is applied to all other values and that result is passed as the this value.
Even though the thisArg is passed without modification, non-strict functions still perform these transformations upon entry to the function.

意訳
「注意1: thisArg値はthis値として変更なしで渡されます。
これはECMAScript 3thの『undefined または null の thisArg がグローバルオブジェクトに置換され、他の全ての値は ToObject が適用され、その結果がthis値として渡す挙動』からの変更点です。
現在では、thisArg が変更なしで渡されたとしても、非Strict Modeでは関数呼び出し処理の初めに、これらの変換を実行します。」

グローバルオブジェクト

グローバルオブジェクトにはいくつか要件がありますが、次のように覚えると良いと思います。

  • グローバル変数をプロパティに持つオブジェクト
  • グローバルコード上で this で参照できるオブジェクト

HTML

1<script> 2console.log(this); 3console.log(Function('return this')()); 4</script>

Re: Kimsehwa さん

投稿2019/03/11 13:01

think49

総合スコア18162

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問