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を
読んだりする、って読める