読者です 読者をやめる 読者になる 読者になる

【JS】テストコード書き書きしながら関数の勉強3

引き続き下記の本を読んでの感想です!

テスト駆動JavaScript

テスト駆動JavaScript

(これを読んだらなにが出来る様になるのか…!)

5.3.4グローバルオブジェクト

トップレベルのthisとwindowは同じ。だから

window.alert('アラート');
alert('アラート');

上の2行のコードは同様。しかもブラウザは自身の情報であるwindowプロパティを持っている。そのため

var global = this;
test("GlobalObjectTest", 3, function(){
  // トップレベルのthisとwindowは同じ
  deepEqual(global, window, 'global == window');
  // トップレベルのthisのプロパティwindowとwindowは同じ
  deepEqual(global.window, window, 'global.window == window');
  // windowのプロパティwindowとwindowは同じ
  deepEqual(window.window, window, 'window.window == window');
});

window.windowなんて呼び出しでもアクセスできる。

5.3.5スコープチェーン

スコープチェーンのことはよくわからなかったのですが、
もし自身のプロパティにその名前がなければ上のスコープまで探しに行くという意味のようです。
実際グローバル変数がどこからでも見えるのは、スコープチェーンでトップレベルまで見に行くからです。
それよりも以下のサンプルソースではクロージャのほうが驚きでした。
クロージャに関してはまたどこかでやりましょう!

test("test_chain", function () {
  var inc = adder(1);
  var dec = adder(-1);

  // inc、decは関数で、自身でbaseの情報を保存している。
  equal(inc(2), 3, "inc(2) equals 3");
  equal(dec(4), 3, "dec(4) equals 3");
  equal(dec(inc(3)), 3, "dec(inc(3)) equals 3");
});