SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
第一回
JavaScript勉強会
小倉 大樹
JavaScript道
1. 必須の基礎知識
2. モダンJavaScript 初級編
3. JavaScript最新事情
4. 以後未定
ECMAScript
今日はここやります
JavaScriptの基礎知識
jQuery その前に
strict mode
変数宣言
関数定義
スコープ
クロージャ
プロトタイプ指向
Courses
JavaScriptの基礎知識
Strict mode
ゆるふわ禁止
strict mode
(厳格モード)とは?
"use strict"; // global
!
function() {
"use strict"; // innner only
}
strict mode
宣言されていない変数への代入
書込み不可の変数への代入
書き込み不可プロパティへの代入
削除不可のプロパティの削除
プロパティ名の重複
関数の引数名の重複
etcetcetcetc…………
効果
Error!
変数宣言
おおっと 落とし穴!
変数の巻き上げ
以下がどうなるかわかりますか?
(function () {
console.log(a);
var a = 'aaaa';
console.log(a);
})();
undefined
“aaaa”
エラーにならない!
変数の宣言
変数の巻き上げ
どうしてエラーにならなかったの?
(function () {
var a;
console.log(a);
var a = 'aaaa';
console.log(a);
})();
こういう風に解釈されたから
変数の宣言
全部 ”button No. ${buttons.length}” と表示されてしまう!
なんか問題あんの? 適当に書けて便利じゃん?
var buttons = document.querySelectorAll('button');
for (var i = 0; i < buttons.length; i++) {
buttons[i].addEventListener(
'click',
function () { console.log('button No.' + i); }
);
}
変数宣言のルール
変数の宣言は全部関数の先頭で
ダサいけど、そういう言語だから諦める
関数定義
案外ややこしい
関数宣言
関数式
// statement
function hoge() {}
!
// expression
var hoge = function() {};
何がちがうの……
わからん!
関数の定義方法
宣言だと関数名の巻き上げが行われる
なのでルーズな書き方が出来てしまう
どっちを使うべきなの?
ゆるふわ禁止!
基本は関数式!
スコープ
基本です
スコープ
二種類しかないよ
var globar = 'global desu';
!
function scope1() {
var locar = 'local desu';
console.log(globar); // global desu
function scope2() {
var locarSecond = 'local mark2 desu';
console.log(locar); // local desu
}
console.log(locarSecond); // ReferenceError: locarSecond
is not defined
}
console.log(locar); // ReferenceError: locar is not
defined
スコープ
応用テクニック
(function() {
var locar = 'local desu';
window.globar = 'global desu';
})();
console.log(locar); // ReferenceError: locar is not
defined
console.log(globar); // global desu
グローバル汚染を防ぐため、ほんとに最低限の作法。
モダンJSにおいてはモジュール化の手法を学ぶべし。
クロージャ
これ知らないとはじまらない!
その前に
呼び出すたびに
数をインクリメントしていく関数
作れますか何種類
クロージャの例題あるある
簡単な実装
var i = 0;
!
var inc = function() {
i += 1;
return i;
};
!
inc(); // 1
inc(); // 2
inc(); // 3
いけてない……
var i = 0;
var h = 0;
!
var inc1 = function() {
i += 1;
return i;
};
!
var inc2 = function() {
h += 1;
return h;
};
何がダメか
グローバル汚染、汎用性なし、拡張性なし……
クロージャ使えってか?
クロージャを使った解答
var incrementGenerator = function (start) {
var inc = function () {
start += 1;
return start;
}
return inc;
};
!
var inc1 = incrementGenerator(0);
var inc2 = incrementGenerator(0);
!
inc1(); // 1
inc2(); // 1
inc1(); // 2
inc2(); // 2
なるほどわからん
関数閉包はプログラミング言語における関数オ
ブジェクトの一種。いくつかの言語ではラムダ
式や無名関数で実現している。引数以外の変数
を実行時の環境ではなく、自身が定義された環
境(静的スコープ)において解決することを特
徴とする。関数とそれを評価する環境のペア
であるともいえる。この概念は少なくとも
1960年代のSECDマシンまで ること
ができる。
from wikipedia
どういうこと?
復習:スコープ
var globar = 'global desu';
!
function scope1() {
var locar = 'local desu';
console.log(globar); // global desu
function scope2() {
var locarSecond = 'local mark2 desu';
console.log(locar); // local desu
}
console.log(locarSecond); // ReferenceError:
locarSecond is not defined
}
console.log(locar); // ReferenceError: locar is not
defined
復習:スコープ
var staticScope = (function () {
var locar = 'local desu';
var innerEnvironment = function () {
return locar;
};
return innerEnvironment;
})();
!
console.log(staticScope()); // local desu
console.log(staticScope()); // local desu
参照した変数が生き続ける
レキシカルスコープ
理解のポイント
• 上のスコープ(関数)の変数を参照(束縛)出来る
• 束縛した環境は持ち運べる
• 実行ごとに新しい環境が作られる
• 定義時の静的なスコープが参照範囲
それだけ
Q:何に使えるの?
例えば
• データと振る舞いの結合が出来る
• プライベート変数、関数みたいなものを作れる
• カリー化などの関数型テクニック
• その他……
A:色んなところ
でも循環参照だけは勘弁な!
呼吸するように使う
プロトタイプ指向
クラスとは違うのだよ
オブジェクト指向に
大切なこと
振る舞いとデータの結合
情報の隠
多態性
case: プロトタイプ
var Greeter = (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
})();
!
var greeter = new Greeter("world");
console.log(greeter.greet());
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
!
var greeter = new Greeter("world");
console.log(greeter.greet());
case: クラス
JavaScriptは
オブジェクト指向言語
Caution!
JavaScriptのヤバいところ
オブジェクトの定義方法がいくつもある
クラス的なものの定義方法もいくつもある
継承的なものの実現方法がいくつもある
後から定義を拡張したりとか出来る
それぞれ流行り廃りが激しい
しかもそれぞれ互換性がなかったりする
やってはいけない
そもそも使い方を知らない(論外)
ネットで探してコピペ(論外)
オレオレオブジェクト指向ライブラリを作る(趣味でやろう)
サードパーティライブラリが提供しているものを使う(微妙な所)
どうするべき?
チームで話し合ってライブラリと書き方を統一する
AltJSを使う
EcmaScrip6を待つ
しかないと思う……
次回の予定
オブザーバーパターン
jshint
Promise
モジュール化いろいろ

Weitere ähnliche Inhalte

Was ist angesagt?

JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」y torazuka
 
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介Yuki Fujisawa
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみたKengo Toda
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話Shogo Sensui
 
Java初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみたJava初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみたAya Ebata
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話disc99_
 
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)parrotstudio
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会Masahiro Wakame
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEWMasahiro Wakame
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門spring_raining
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3Masahiro Wakame
 
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略Y Watanabe
 
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
覚醒JavaScript  -ES6で作るIsomophicアプリケーション-覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
覚醒JavaScript -ES6で作るIsomophicアプリケーション-Oonishi Keitarou
 
Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話_kondei
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform信之 岩永
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 

Was ist angesagt? (20)

JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
 
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話
 
Java初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみたJava初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみた
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話
 
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
歌舞伎座Tech Rx会
歌舞伎座Tech Rx会歌舞伎座Tech Rx会
歌舞伎座Tech Rx会
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
 
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
覚醒JavaScript  -ES6で作るIsomophicアプリケーション-覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
 
Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 

Ähnlich wie JavaScript基礎勉強会

ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめYuki Ishikawa
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門Ishibashi Ryosuke
 
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」fukuoka.ex
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文Appresso Engineering Team
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数ztyper
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)tnoda
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門masatora atarashi
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそDavid Buck
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4Shingo Inoue
 
Flow.js
Flow.jsFlow.js
Flow.jsuupaa
 

Ähnlich wie JavaScript基礎勉強会 (20)

ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめ
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門
 
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Clojure
ClojureClojure
Clojure
 
jenkinsで遊ぶ
jenkinsで遊ぶjenkinsで遊ぶ
jenkinsで遊ぶ
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそ
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4
 
Flow.js
Flow.jsFlow.js
Flow.js
 

JavaScript基礎勉強会