プロが教える店舗&オフィスのセキュリティ対策術

strictモードでvarを付けない変数宣言はエラーになると思いますが、

nameはエラーになりません。

何故でしょうか?

質問者からの補足コメント

  • 'use strict';

    aaa = "taro";
    document.write(aaa);

    はエラーになるのに

    'use strict';

    name = "taro";
    document.write(name);

    はエラーになりません。

      補足日時:2017/03/04 00:17

A 回答 (2件)

ANo1です。



nameの場合は変数というよりは、windowオブジェクトのプロパティ(r/w可)としてnameが既設定されていますので、これを上書きしているものと思います。
それなので、
 name = "taro";
は、変数宣言とはみなされないと解釈した方がよさそうです。
https://developer.mozilla.org/ja/docs/Web/API/Wi …

一方で、グローバルに宣言した変数は、windowオブジェクトのプロパティのようになります。(正確なところは知りませんが、見掛け上はそうなります)
 var hoge = "taro";
 alert(window.hoge); // taro

似たようにr/w可能なwindowのプロパティを探してみるとstatusも同様ですね。
(書き込み禁止になっていると、エラーになるかも知れませんが…)

さらには、読み取り専用のプロパティに代入してみると…
 length = "taro";
この場合は、ブラウザによっても対応が異なるようです。
 IE:ReferenceError: assignment to undeclared variable
 fx:無視(エラーにならない)


>でもnameという名前の変数はプログラマーが勝手に作っても良いのですよね…。
nameプロパティにオブジェクトや関数を代入するとエラーになるかと思い試してみましたが、一応、代入はできてしまうようです。
ただし、これを呼び出そうとするとTypeError等になったりするようですので、通常の変数と完全に同等というわけでもなさそうです。
var宣言した上で関数を代入した場合でも、実行できるブラウザとエラーになるブラウザがあるようです。

また、何らかの都合で、window.nameで識別するような必要が生じた場合は、思わぬことになる可能性がありますので、予約語的に扱っておいた方がよいのかもしれませんね。
    • good
    • 0
この回答へのお礼

とてもご丁寧な回答誠にありがとうございます。

ネット・書籍等いろいろ探しましたがどこにも記述されていないので質問してみました。

>window.nameで識別するような必要が生じた場合は、思わぬことになる可能性がありますので、予約語的に…

なんとなくモヤモヤ感が残りますが、現状ではやはり上記のように考えておくのが良いのでしょう。

どうもありがとうございます〜!

お礼日時:2017/03/06 19:15

単純に、


 window.name
を上書きしているだけだからではないでしょうか?
    • good
    • 0
この回答へのお礼

回答誠にありがとうございます。

ということは、

name という変数名をもしプログラマーが作成した場合、
strictモードは役立たないという認識で大丈夫でしょうか?

でもnameという名前の変数はプログラマーが勝手に作っても良いのですよね…。

お礼日時:2017/03/06 15:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!