B-Teck!

お仕事からゲームまで幅広く

【雑記】あけましておめでとうございます

2018年ですね。
1月も2/3終わってますがいかがお過ごしですかね。

自分は今月から新しい職場で働いてるんですけど、
最初一週間は会社に慣れるための研修?のようなものだったので、
技術的な領域に触れるのは実質今週からでした。

前職がよく言えばある程度枯れた、悪く言えばレガシーシステムといった感じで、
そもそも対応ブラウザにIE8がいるとか、メンテしてるのがJava1.4とかそんな世界だったので、
まずそこそこモダンな環境のそろった職場にびっくり。
後はベンチャー系というか、Web系というか、そのへんの空気感なのかもしれないんですけど、
どこ行ってもみんな割と楽しそうというか、学校みたいな雰囲気なんですよね。
とりあえず慣れない私服勤務も含めて、早く慣れようとえっちらおっちらやってます。

そんな感じで、ここ二週間はしょっぱなで忙しい感じでしたけど、
そろそろ慣れてきた感じもあるのでこっちの更新時間にももう少し当てられたらいいなぁ…

次は自分がWeb領域に関わることになったので、
SEOについて勉強したことをざっくりまとめる記事になるような気がします。
(いくつか書きかけのストックもあるのでもしかしたら前後するかもですが)

ともあれ、2018年もゆるく更新していくのでどうぞよろしくお願いしますね。

【JavaScript】JavaScriptの変数・関数の巻き上げ(ホイスティング)

ホイスティングとは

JavaScriptは、関数内でvarで宣言した全ての変数が先頭で宣言したことになる。
この、宣言が先頭に移動する仕様をホイスティング、または宣言の巻き上げと呼ぶ。
宣言のみが先頭に移動し、代入された変数は移動しないため、
直感的ではない動作をするケースが有る。

変数の巻き上げ

var scope = 'global';

function test() {
  // 関数内のscopeの宣言のみが巻き上がるので
  // undefinedになる
  console.log(scope); 

  // 宣言は巻き上がっているので代入のみ行われる
  var scope = 'local';
  // 代入されたlocalが出力される
  console.log(scope);
}

test();

見た目上は最初のconsole.log(scope)ではglobalが出力されそうだが、
undefinedが出力される。

その原因は、test()が実際には下記のコードと等価になるせいだ。

function test() {
  // 宣言のみ先頭に移動
  var scope;
  // 値は代入されていないのでundefined
  console.log(scope); 

  scope = 'local';
  // 代入されたlocalが出力される
  console.log(scope);
}

ES2015の場合

実は、ES2015以降ではホイスティングを考慮せず記述することができる。
varではなくletまたはconstで宣言を行うと、宣言より前に使用された変数は
ReferenceErrorが出力されるようになった。

var scope = 'global';

function test() {
  // letで変数が宣言された場合、
  // 宣言は巻き上がらずReferenceErrorとなる
  console.log(scope); 

  let scope = 'local';
  console.log(scope);
}

test();

関数の巻き上げ

関数については、function文で宣言したものについては、その定義ごと巻き上がる。
変数に保持した場合は、変数のときと同様の動作となる。

function文で宣言した場合

定義ごと宣言が巻き上がるため、実行することができる。

function hoge() {
  // fuga()の定義も巻き上がっているので、  
  // 使用することができる。
  fuga();
  function fuga() {
    console.log('fuga');
  }
}

hoge();

varで宣言した場合

宣言のみ巻き上がるが、実行不可能。

function hoge() {
  // fugaの宣言のみ巻き上がるが、
  // undefinedのため関数として実行することができず
  // TypeErrorが発生する
  fuga();

  var fuga = function () {
    console.log('fuga');
  }
}
hoge();

letconstで宣言した場合

巻き上がらないため、実行不可能。

function hoge() {
  // letで宣言しているため定義が巻き上がらず、
  // ReferenceErrorが発生する
  fuga();

  let fuga = () => {
    console.log('fuga');
  }
}

hoge();

【雑記】2017年お疲れ様でした

今年も1年お疲れ様でした。
この1年は、引越し、結婚、母の一周忌、転職と盛りだくさんの1年で、
知人、友人の方には色々とご迷惑、ご心配をおかけしました。

結婚

6月に一緒に住みはじめて、7月に入籍した妻とは、
やはり初めての共同生活なのでぶつかるところもあるけれど、
都度解決しながら前に進めてるのかなと思います。
今後もこうやって一歩ずつ関係を深めていければいいのかなと思います。

転職

来年は1月から新しい職場での勤務で、Androidアプリやるのかな?と思ってたら、
実は配属先はWebアプリの部署だったので、あんまりやってることは変わらなそうです。
とはいえ、扱う領域がBtoBからBtoCに変わったので、今まで以上に考えることが多くなりそう。
ちょっと不安な感じです。
また、これまでの職場、常駐先の皆様にはお世話になりました。
今後も関係の続く方は改めてよろしくお願いしますね。

ブログ

このブログは、今月も無事月間1万アクセスを超えました。
世間の仕事納めの影響かここ二日は落ち込んでますが…。
このペースだと今年度末の3月までには累計30万PV行くかなって感じです。
大したことも書いてないブログですが、今後もよろしくお願いいたします。 f:id:beatdjam:20171229231931j:plain

皆さん、来年もよろしくお願いいたします。
良いお年を!