kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

TiddlyWikiのソースを読む 続き1

 boot.jsの続きから

/*jslint node: true, browser: true */
/*global modules: false, $tw: false */

なにかを説明するためのコメントではなさそうな雰囲気
jslintはJavaScript lintってことだろう
検索

JSLint: The JavaScript Code Quality Tool これか
ふむふむ

このコメントの説明はDirectivesっぽい

jslint node: trueはnode.jsで使われるグローバルな名前を定義済みとして扱う、
jslint browser: trueはブラウザで使われるグローバルな名前を定義済みとして扱う、
globalは変数がグローバル変数だよと教えてあげるものらしいけど
: falseが何かは書いてないなあ
JavaScriptの仕様とは思えないし

ちなみにこのソースをサイトにコピペしてjslistにかけてみたら大量にWarningが出るんだけれども
Warningは無視ってことだろうか
そもそもディレクティブは最初のステートメントの前に書いてないといけません、ってことに
なってるんだけど・・・
ステートメントじゃなくて式だからいいんです、とかなの?

いや式もステートメントっぽいよWarningも出てるし

Place the '/*jslint*/' directive before the first statement.
  /*jslint node: true, browser: true */

まあでもこれくらいでスルー

"use strict";

とは

まあ調べなくても雰囲気でわかるんだけど検索

正式なところだと14.1.1 Directive Prologues and the Use Strict Directive とか、
Strict Modeそのものについては4.2.2 The Strict Variant of ECMAScriptとか
あたりっぽいけど読むのが面倒なのでMDN Web DocsのStrict モードをざっと読んだ
ふーん
このサイトは頼りになりそう

if(!$tw) {
    $tw = require("./bootprefix.js").bootprefix();
}

$twが空っぽだったらbootprefix()にしちゃうよ
昨日のTiddlyWiki()もそうだったけど
bootprefixを関数にしておくのはどういう意味だろうか

if (!$tw)って言うけどJavaScriptの何が真で何が偽なのか

true に変換できる値は、いわゆる truthy です。false に変換できる値は、いわゆる falsy です。
false と見ることができる式の例は、null、0、空文字列 ("")、あるいは、undefined と評価されるものです。

逃げよう 沼っぽい

bootprefix.jsの方を見てみる

This file sets up the globals that need to be available when JavaScript modules are executed in the browser.

ブラウザでもモジュールが使えるようにグローバル変数をセットアップします

$tw = $tw || Object.create(null);
$tw.boot = $tw.boot || Object.create(null);

$tw$tw.bootが未定義だったら空っぽのオブジェクトとして定義しようって
ことだな

// Detect platforms
if(!("browser" in $tw)) {
    $tw.browser = typeof(window) !== "undefined" ? {} : null;
}
if(!("node" in $tw)) {
    $tw.node = typeof(process) === "object" ? {} : null;
}
if(!("nodeWebKit" in $tw)) {
    $tw.nodeWebKit = $tw.node && global.window && global.window.nwDispatcher ? {} : null;
}

こういうヒューリスティックな感じのやつはあんまり読みたくない気分
表面だけ読む

inは指定されたプロパティがあるかどうか

{}は空のオブジェクトらしい
nullとは別っていうのはまあいいとして
Object.create(null)との差はなんだ

このコードからするとnullは偽だけど{}は真なんだろうな

JavaScript難しい

$tw.boot.tasks = {
    trapErrors: !!($tw.browser && !$tw.node),
    readBrowserTiddlers: !!($tw.browser && !$tw.node)
};

!!って何だ 新手の演算子
いやどうもそうでもなさそうだ
ってことは否定の否定
なんでもありの値をtrueかfalseかのどちらかにしてしまうためのイディオムかな

nodeじゃなくてbrowserなときはエラーをトラップしたりBrowserTiddlerを
読んだりする、って読める