私はC++やC#は長いのですが、WEB系の技術には疎いです。htmlやcssを触れないことは無いけど慣れていないのでむちゃくちゃ時間がかかるレベルです。
業務でJavsScriptのメンテが必要になったのですが、JavaScriptはデスクトップ系の言語とは基本的な考え方が異なるようで中々頭に入ってきません。main()関数からの実行開始になれているため、ドキュメントの中にプログラムを埋め込んだ関数が呼ばれるタイミングを把握できていないせいかもしれません。
JavaScriptの基本的な考え方(特にJavaScript関数が呼ばれる最初のきっかけに何があるのか)を解説しているサイトはないでしょうか?
また、JavaやC#等のデスクトップ系の言語と対比して解説しているようなサイトがあれば教えて頂けると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/06 05:29

回答7件
9
JavaScriptの実行タイミング
これに対してJavaScriptの関数がいつ呼ばれるのか?の把握が甘そうなのです。
綺麗にまとまっているサイトが思い浮かばなかったので、下記にまとめました。
やや情報を詰め込みすぎたきらいがあります。
「入門向け」と「実行タイミング」で情報を分離すべきでしたが、今から修正すると時間をかかるので、公開します。
(※Typora等のmdファイルをアウトライン表示できるエディタで閲覧する事を推奨)
不明点や誤りがあれば対応しますので、気軽に聞いてください。
main() 関数の代替
JavaScriptの場合、関数を自由に定義できるので main 関数という概念はありませんが、ES3, ES5 時代にはグローバル汚染を回避する為に即時関数で括る慣習がありました。
JavaScript
1<script> 2/** 3 * (A) ES3/ES5 4 */ 5'use strict'; 6(function () { // FunctionExpression 7 function handleClick (event) { 8 console.log(event.type); 9 } 10 11 function main () { 12 this.document.addEventListener('click', handleClick, false); 13 } 14 15 main.call(this); 16}.call(this)); 17</script>
ES6 (ES2015) 時代もグローバル汚染は回避しますが、回避手段が増えています。
JavaScript
1<script> 2/** 3 * (B) ES6 (ES2015) type1 4 */ 5'use strict'; 6(() => { // ArrowFunction 7 function handleClick (event) { 8 console.log(event.type); 9 } 10 11 const main = () => { 12 this.document.addEventListener('click', handleClick, false); 13 }; 14 15 main(); 16})(); 17 18/** 19 * (C) ES6 (ES2015) type2 20 */ 21{ // BlockStatement 22 const handleClick = function handleClick (event) { 23 console.log(event.type); 24 }; 25 26 const main = () => { 27 this.document.addEventListener('click', handleClick, false); 28 }; 29 30 main(); 31} 32</script>
いずれも私が気を付けていることは、main 関数がグローバルコードと同じ this 値を持っていることです。
が、これは私の個人的なポリシーであり、標準的な基準があるわけではありません。
関数宣言と関数式
function(){ ... } はラムダ式の定義、
式の定義という意味では正しいのですが、実は条件があります。
関数の種類 | 制限事項 |
---|---|
関数宣言 (FunctionDeclaration) | function キーワードで始まらなければならず、名前をつけなければならない |
関数式 (FunctionExpression) | function キーワードで始まってはならず、名前は付けても付けなくても良い |
関数宣言はfunction キーワードで始まらなければならないと決まっている為、いわゆる即時関数と呼ばれる書き方では ()
や +
等を先頭に置くことで関数式化しています。
JavaScript
1(function main () { // "(" で始める事で関数式扱いとなる (関数式なので名前は付けても良い) 2 console.log(main.name); 3}());
グローバルコード上の this 値
thisはDOMツリーのルートということなのですね。
これは違います。
DOM 規定ではなく、ECMAScript 規定によって、「グローバルコード上では this 値がグローバルオブジェクトである」と定められています。
そして、window
キーワードでグローバルオブジェクトを参照できるのは、DOM 規定によるものです。
JavaScript
1/** 2 * グローバルコード 3 */ 4window.parseFloat('1.0'); // (A) 5this.parseFloat('1.0'); // (B)
上記コードは、Webブラウザ上ではどちらも期待通りに動作しますが、Node.js では (A) が動作せず、(B) のみ期待通りに動作するでしょう。
Node.js は window キーワードでグローバルオブジェクトを参照できませんが、ECMAScript 仕様は実装されています。
その為、ECMAScript 仕様の範囲内である this
値による参照は有効なのです。
ちなみに、DOM 上のルートノードは元々は document
でした。
Document Object Model の名が示す通りですね。
ですので、document.parentNode
は未定義です。
window
は長らく、標準化されていませんでしたが、HTML Standard の既定と同時に window
オブジェクトが定義され、DOM Standard でも定義されました。
DOM Standard では少し、複雑で3つのツリーが出てきます。
- Node tree上 に Document は存在しますが、Window は存在しません
- Document tree 上の root は document です
- Shadow tree 上の root は ShadowRoot であり、Window です
Re: Chironian さん
投稿2018/05/06 13:31
編集2018/05/06 16:31総合スコア18194
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

5
ベストアンサー
JavaScript 入門 - Google 検索 の結果出てきたサイトを取り上げています。広告とリンク集だけのサイトは除外しています。なお、リンク集になっているサイトに記載されている物も含めています。
基本的に無料である程度できることを前提とします。途中まで無料だが、続きは有料のサービスや、書籍の紹介のようなものは一部を除き除外しています。オススメ度は独断と偏見による物で、絶対的な物ではありません。
JavaScript入門
オススメ度: ☆☆☆☆☆
対象読者: プログラミング初心者(要HTML知識)
バージョン: ES5
環境: ブラウザのみ
エコシステム: 解説無し
HTMLにJavaScriptを埋め込むオーソドックスな方法しか説明していない。ブラウザでちょっとした動作をさせる程度は出来ても、モダンなサイトの構築は出来ない。Node.jsを用いたサーバー構築なんかも出来ない。実装例が豊富に用意されているが、ES3以前なのか"use strict";
無しの即時関数で囲み無しで使う価値なし。何もわからないコピペプログラマーを量産するだけだろう。自分のサイトにちょっと使いだけなら良いが、本格的に学びたいのであれば、避けるべきだろう。
初心者のためのJavaScript入門 - @IT
オススメ度: ☆☆☆☆☆
対象読者: プログラミング初心者
バージョン: ES5
環境: ブラウザのみ
エコシステム: 解説無し
全く更新されていない。内容が古すぎるので、読む価値なし。
JavaScript入門 - 基本構文の解説とクラス/関数リファレンス
オススメ度: ☆☆☆☆☆
対象読者: プログラミング初心者
バージョン: ES5
環境: ブラウザのみ
エコシステム: 解説無し
最初のJavaScript入門と同レベルだが、まだ、体系立っているように見える。リファレンスがあるが、数も少ないし、こんなの見るぐらいならMDN見た方がいい。実装例もES3以前なのか"use strict";
無しの即時関数で囲み無しで使う価値なし。使う価値なし。なにより広告がウザい。
2017年版、5分でわかるJavaScript入門(ES6対応版) - paiza開発日誌
オススメ度: ★★★★☆
対象読者: プログラミング経験者
バージョン: ES2015
環境: ブラウザ + Node.js
エコシステム: 解説無し
プログラミング経験者が手っ取り早くJavaScriptの文法を知る程度なら十分。ただ、ボリューム的には紹介程度になっているため、リファレンスやエコシステムについて学ぶには他のサイトを参照する必要があるだろう。JavaScriptをきちんと学べるというわけではないが、短いし、読んで損は無いと思われる。
JavaScript初心者向けの入門ページ
オススメ度: ☆☆☆☆☆
対象読者: プログラミング初心者
バージョン: ES5
環境: ブラウザのみ
エコシステム: 解説無し
サンプルがvar
無しのグローバル変数になっている。最初にこんあ入門を読んでしまっては、まともなJavaScriptは書けるようにならない。もはや、害悪でしかない。
JavaScript入門 (全24回) - プログラミングならドットインストール
オススメ度: ★★☆☆☆
対象読者: プログラミング初心者
バージョン: ES5
環境: ブラウザのみ(別途Node.js入門あり)
エコシステム: 解説無し(別途gulp入門等があり)
動画による解説。即時関数の説明があるので、それだけでも他より優秀。ES3までなのか、"use strict";
やArray.prototype.map
等の解説はない模様。時代遅れでも良いなら、十分かも知れない。
とほほのJavaScriptリファレンス
オススメ度: ★☆☆☆☆
対象読者: プログラミング初心者
バージョン: ES2015
環境: ブラウザのみ
エコシステム: 解説無し
昔Webサイトを作るときに誰もがお世話になった老舗であるとほほのサイト。20年以上も更新し続けているというのが凄い。入門と言うよりリファレンスに近い。ES2015対応で、"use strict";
の解説もあるのに、なぜ、サンプルはグローバル変数なのだとツッコミ所が多少ある。ブラウザの互換性などの解説も丁寧なのだが、内容が新旧入り交じっており、いまさら「Netscape Navigator 2.0では~」といわれてもちょっと戸惑う。古い内容の手直し手直しでちょっと無理が出てきたのではないだろうか。それだけ、JavaScriptが昔に比べて変わったと言うことだが。
リファレンスとしてはMDNの方が豊富かつ正確なため、微妙に使い所がない。
Learn to code | Codecademy
オススメ度: ★★☆☆☆
対象読者: プログラミング初心者
バージョン: ???
環境: ???
エコシステム: ???
英語のみ。実際にコードを書いて学ぶという形式。さわりしか試していないが、いいのでは無いかなと思う。使っている人も多いらしい。
目次や概要が見当たらなかったので、なにをどこまで学べるかはよくわかっていない。ES2015やNode.js、BabelやWebpack等も教えてくれそうな雰囲気だけはある。
JavaScript | プログラミングの入門なら基礎から学べるProgate[プロゲート]
オススメ度: ★☆☆☆☆
対象読者: プログラミング初心者
バージョン: ES5
環境: ブラウザ
エコシステム: 解説無し
無料は途中まで。途中から有料になることを覗けば、スライドの説明は絵があって、わかりやすい。だが、有料で開放されるコースを見てもちょっとボリューム不足を感じる。
CODEPREP | プログラムを書いて動かしながら学ぶ実践型のプログラミング学習サービス
オススメ度: ★★★★☆
対象読者: プログラミング初心者
バージョン: ES5, ES2015
環境: ブラウザ
エコシステム: 解説無し
実際にコードを書いて学ぶという形式。別分けだがES2015もあるし、"use strict";
もあるし、かなり実践的な内容とも思われる。どこから有料になるのかがちょっとわからなかった。
マンガで分かる JavaScriptプログラミング講座
オススメ度: ★★☆☆☆
対象読者: プログラミング初心者
バージョン: ES5(ES2015のコラムあり)
環境: ブラウザ
エコシステム: 解説無し
まんが。漫画世代にはいいのかもしれない。ちょっと内容が臼杵がしないでもない。
JavaScript入門編(2レッスン) | プログラミング学習ならpaizaラーニング
オススメ度: ★★★☆☆
対象読者: プログラミング初心者
バージョン: ES5
環境: ブラウザ
エコシステム: 解説無し
こちらも実際にコードを書いて学ぶという形式。スライドを見るのでは無く、動画を見るという形式。ES2015などは全くないようなところが残念と言ったところか。
他にも色々あるようですが、疲れたので勘弁して下さい。全てを細かく見たわけではありませんので、ここが違うというのがあれば、コメントでご指摘下さい。
ES5とES2015の違いはC++03とC++11の違いみたいなもんと思っていただければ、大体イメージがつかめるかと思います。
投稿2018/05/06 06:56
総合スコア21741
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

5
JavaScriptの基本的な考え方
【JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript
↑ Firefoxの開発でおなじみのmozillaの出している物が基本的な部分(言語仕様としての基本的な部分)も触れてはいます。ただ、英語サイトの翻訳であったりするため、初学者向けとはあまり思いません。
【JavaScriptの基本をサルでもわかるようにまとめた【入門用】 - いつ俺〜いつから俺ができないと錯覚していた?〜】
http://www.ituore.com/entry/javascript-basic
Webの情報は「体系立てた情報」で無いことが多いので、本屋で何冊か本を買って読むと言う方法が良いと思います。JavaScript ならとりあえず下記3冊が(少し情報が古いところもありますが)お勧めです。
【O'Reilly Japan - JavaScript 第6版】
https://www.oreilly.co.jp/books/9784873115733/
【O'Reilly Japan - 初めてのJavaScript 第3版】
https://www.oreilly.co.jp/books/9784873117836/
【改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで | 山田 祥寛 |本 | 通販 | Amazon】
https://www.amazon.co.jp/dp/477418411X
以前より teratail で回答をお見かけしているので、どのあたりで躓いておられるかが想定しにくいですね・・・。
投稿2018/05/06 05:20
総合スコア69621
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/06 06:42 編集
2018/05/06 06:48

4
こういうのは相性があるかと思いますので難しいですが、下記二つはいい感じだと思います。
JavaScript初級者から中級者になろう — uhyohyo.net
この書籍について · JavaScriptの入門書 #jsprimer
なんとなく追記
特にJavaScript関数が呼ばれる最初のきっかけに何があるのか
<script> タグに async / defer を付けた場合のタイミング - Qiita
もしかして、↑この辺の話でしたか。
投稿2018/05/06 06:16
編集2018/05/06 08:36総合スコア37303
3
ドキュメントの中にプログラムを埋め込んだ関数が呼ばれるタイミングを把握できていないせいかもしれません。
JavaScriptの基本的な考え方(特にJavaScript関数が呼ばれる最初のきっかけに何があるのか)を解説しているサイトはないでしょうか?
回答欄を斜め読みした感じ、ブラウザがHTMLを読み込み、Scriptタグを読み込み、
どうやって実行させているのかをさらっと書いているものは見つかりませんでした。
この辺はなんか本だとちょっと弱そうですね…
ざっくりした概念はこの回答にぶら下げていきます。
詳細は調べればいくらでも出てくると思いますので、あくまで森の紹介にとどめます。
業務でJavsScriptのメンテが必要になったのです
Chrome等のブラウザでWebサイトにアクセスしてHTMLファイルを読み込みます。
HTMLはSGML系の<tag></tag>
のような書き方をする実装の一つですので、
ブラウザはタグを見つけ次第、ブラウザは自前で搭載しているDOMのAPIでツリー構造を作って放り込んでいきます。
この時に<script></script>
を発見すると中身の文字列をJavaScript(以下JS)のコードとして実行しはじめます。
大雑把なルールはこちらです。
この辺の挙動はW3Cが出している仕様書を見れば書いて有りそうですが、
実装からみた感じなのでソースはありません。
- HTMLファイルの先頭に近いscriptタグから順番に実行される
- src属性が設定されている場合、内部の文字列は捨てて外部ファイルを読み込む
- JSには言語仕様上外部スクリプトの読み込みという機能がない
- JSの実行中、DOMツリーの構築は停止する
JS外部ファイルの読み込み方
HTMLファイルの先頭から順次実行されるという特性があるので、
jQuery等の外部ライブラリが必要になった時は全て本命のJSより上の行で宣言してください。
(既存のプロジェクトは全てそうなっているはずです)
HTML5ではこのルールに従わない挙動が可能ですが、
例外に関してはこの辺の記事を読んでみてください。
※ES2015という新しい仕様でimport構文が追加されましたが、
JSコード単体が勝手に外部のJSを読み込んでロードするほどの機能はありません。
使い方はこの質問のマイスマ君さんの回答を参考にしてみてください。
https://teratail.com/questions/124725
外部ライブラリの実装
基本的にはグローバル変数領域に直書きでvar jQuery = function...
という風な事が記載されています。
じゃあライブラリをぽこぽこ呼び出すだけで勝手に衝突しちゃうじゃん!
まさに指摘通りなので気をつけてください。
JSではグローバル変数は出来るだけ宣言しないという運用ルールでカバーします。
グローバル変数領域に自分のライブラリ名だけ宣言しておき
中身はクラス的なものを配置、jQuery.hoge(123)
という風にプロパティやメソッドにアクセス使うという設計になっているのが一般的です。
※IE11がimport/exportに対応していない為、
後5年程度はimport構文を使って読み込むライブラリは出ないでしょう。
main関数の代わり
JSはscriptタグの宣言と同時に発火するので
DOMツリー構造が整う前に全ての処理が実行され、終わってしまいます。
じゃあ値や関数の宣言しか出来ないじゃんどうすんの?
JSはイベント駆動型という話を聞いた事がありませんか?
JSは関数が第一級オブジェクトです。
変数に代入、関数の引数に設定、関数の戻り値として返す…という事がまるで文字列型や数値型と同じように出来ます。
JSではブラウザのイベント格納場所をAPIとして公開しています。
やりたい事を関数として宣言しておいて、決められたイベント格納場所に登録しておけば、
イベントの発火条件を満たした時点で自動的に登録済みの関数を発火してくれます。
各ブラウザはEventTarget.addEventListener()等のAPIを準備しています。
この辺はJSのリファレンス本などに書かれていますので、割愛します。
DOMのレンダリングを待つ方法
body.onload = fn
: バッドプラクティスwindow.addEventListener('DOMContentLoaded', fn)
: 基本はこれwindow.addEventListener('load', fn)
: 画像ファイル・CSSファイルの読み込みも待ってから発火したい場合はこちら$(fn)
: jQueryのライブラリで用意されているDOMContentLoaded相当のエイリアス
fn
は関数を指しています。
変数に代入して持ってきても良いですし、こんな風にその場で宣言して格納しても良いです。
JavaScript
1// ネイティブJS版 2window.addEventListener('load', function(){ 3 var i = 0; 4}); 5 6// jQuery版 7$(function(){ 8 var i = 0; 9});
一番上のbody.onloadはバッドプラクティスです。
body.onloadは後勝ちで、複数の関数を設定しようとすると最初に設定した関数が剥がされてしまい発火しなくなる不具合の原因になります。
addEventListenerの同じターゲットの同名イベントに複数セットした場合、
基本的にはセットした順番に発火したと思いますが、もし気になる場合は調査してください。
画面への反映の仕方
JSは出力対象が既に出力されてしまっているので、
DOM APIを利用してDOMツリー構造を後から書き換えるという方法で画面を更新します。
基本的な流れは下記のようになるでしょう。
- セレクタ的なメソッドを実行して、対象のHTML要素をつかむ
- つかんだ要素のメソッドを実行して値を取得する
- つかんだ要素のメソッドを実行して値を設定する
まぁ、普通にオブジェクト指向の考え方です。
DOM APIもW3Cが共通の仕様を公開しており、どのブラウザも同じメソッドで同じ挙動をしてくれます。
この辺も詳しくはリファレンス本等を参照してください。
ただ、このDOM APIの作りが非常にイケてないので、
2006年に登場したjQueryというライブラリでラッピングして使うシーンが多いです。
恐らく譲り受けたプロジェクトはjQueryが入ってるんじゃないかと思いますので、
もしそうであればjQuery系の書籍にも目を通しておいてください。
SPAやシャドウDOMに関して
Vue.js等を利用しているプロジェクトの場合、こちらに該当します。
これはDOM操作とか人間が手作業でするもんじゃねーよ、
テンプレート的なHTMLと値だけ渡してあげて、値を書き換えたらDOMの方が勝手にあるべき姿に書き換わってくれない?
…という発想で作られています。
従って自分でDOM APIやjQueryを利用してDOMを書き換えるという思想とは相反する為、
衝突すると意図しない挙動になるかと思いますので注意してください。
投稿2018/05/06 08:28
編集2018/05/06 09:22総合スコア21291
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/06 08:58

1
投稿2018/05/06 05:35
編集2018/05/06 05:36
退会済みユーザー
総合スコア0
1
投稿2018/05/06 05:09
編集2018/05/06 05:13総合スコア527
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。