SlideShare uma empresa Scribd logo
1 de 69
Baixar para ler offline
スコープの話
自己紹介 
Nobuhiro Nakashima 
@ombran 
JavaScript/Ruby/サンホラ/アニオタ 
株式会社アラタナ エンジニア 
Miyazaki.js主催
スコープ
スコープ 
“ある変数や関数が 
特定の名前で参照される範囲のこと” 
– by Wikipedia
スコープの種類
global scope 
プログラム「全体」から見えるスコープ 
file scope 
プログラムを記述したファイルの内側でのみ参照できるスコープ 
local scope 
ある関数やブロックの範囲内に限定されたスコープ 
instance scope 
いわゆるカプセル化 
class scope 
あるクラスの定義全体から参照できるスコープ
global scope 
プログラム「全体」から見えるスコープ 
file scope 
プログラムを記述したファイルの内側でのみ参照できるスコープ 
local scope 
ある関数やブロックの範囲内に限定されたスコープ 
instance scope 
いわゆるカプセル化 
class scope 
JavaScript 
でのスコープ 
あるクラスの定義全体から参照できるスコープ
スコープの例
var scope = "Global"; 
function getValue() { 
console.log(scope); // > undefined 
var scope = "Local"; 
return scope; 
} 
console.log(getValue()); 
// > "Local" (ローカル変数を参照) 
console.log(scope); 
// > "Global" (グローバル変数を参照)
global scope 
var scope = "Global"; 
function getValue() { 
console.log(scope); // > undefined 
var scope = "Local"; 
return scope; 
} 
console.log(getValue()); 
// > "Local" (ローカル変数を参照) 
console.log(scope); 
// > "Global" (グローバル変数を参照)
local scope 
var scope = "Global"; 
function getValue() { 
console.log(scope); // > undefined 
var scope = "Local"; 
return scope; 
} 
console.log(getValue()); 
// > "Local" (ローカル変数を参照) 
console.log(scope); 
// > "Global" (グローバル変数を参照)
スコープの話の前に 
変数の前のやつを 
説明します
varについて
varなし→必ずグローバル 
varあり→スコープ内変数 
varは絶対付けること
スコープをもう 
ちょっと深く
global scope 
• functionの外で宣言された変数・関数 
• varなしで宣言された変数
functionの外で宣言 
var scope = "Global"; 
function getValue() { 
console.log(scope); // > “Global” 
scope = "Global2"; 
return scope; 
} 
console.log(getValue()); // > "Global2" 
console.log(scope); // > "Global2"
varなしで宣言 
function getValue() { 
scope = "Global2"; 
return scope; 
} 
console.log(getValue()); // > "Global2" 
console.log(scope); // > "Global2"
local scope 
• functionの中で宣言された変数・関数 
• functionの引数で宣言された変数
functionの中で宣言 
var scope = "Global"; 
function getValue() { 
console.log(scope); // > undefined 
var scope = "Local"; 
return scope; 
} 
console.log(getValue()); // > "Local" 
console.log(scope); // > "Global"
functionの引数で宣言 
var scope = "Global"; 
function getValue(arg1) { 
console.log(arg1); // > “Global” 
arg1 = "Local"; 
return arg1; 
} 
console.log(getValue(scope)); // > "Local" 
console.log(scope); // > "Global"
なぜこういう挙動 
をするのか
スコープチェーン
var a = “GlobalA”; 
var b = “GlobalB”; 
function func1() { 
var b = “Func1B”; 
function func2() { 
var c = “Func2C”; 
console.log(c); // > “Func2C” 
console.log(b); // > “Func1B” 
console.log(a); // > “GlobalA” 
} 
func2(); 
} 
func1(); 
ここの変数の値 
を探すルール
var a = “GlobalA”; 
var b = “GlobalB”; 
function func1() { 
var b = “Func1B”; 
function func2() { 
var c = “Func2C”; 
console.log(c); // > “Func2C” 
console.log(b); // > “Func1B” 
console.log(a); // > “GlobalA” 
} 
func2(); 
} 
func1(); 
Cはこのスコープで見つかる
var a = “GlobalA”; 
var b = “GlobalB”; 
function func1() { 
var b = “Func1B”; 
function func2() { 
var c = “Func2C”; 
console.log(c); // > “Func2C” 
console.log(b); // > “Func1B” 
console.log(a); // > “GlobalA” 
} 
func2(); 
} 
func1(); 
Bはこのスコープで見つかる
var a = “GlobalA”; 
var b = “GlobalB”; 
function func1() { 
var b = “Func1B”; 
function func2() { 
var c = “Func2C”; 
console.log(c); // > “Func2C” 
console.log(b); // > “Func1B” 
console.log(a); // > “GlobalA” 
} 
func2(); 
} 
func1(); 
Aはこのスコープで見つかる
var a = “GlobalA”; 
var b = “GlobalB”; 
function func1() { 
var b = “Func1B”; 
function func2() { 
var c = “Func2C”; 
console.log(c); // > “Func2C” 
console.log(b); // > “Func1B” 
console.log(a); // > “GlobalA” 
} 
func2(); 
} 
func1(); 
変数の 
検索範囲 
が徐々に 
広がって 
いる
これが 
スコープチェーン
さっきのやつ 
var scope = "Global"; 
function getValue() { 
console.log(scope); 
var scope = "Local"; 
return scope; 
} 
console.log(getValue()); // > "Local" 
console.log(scope); // > "Global" 
この時点で同一スコープを探す
さっきのやつ 
var scope = "Global"; 
function getValue() { 
console.log(scope); 
var scope = "Local"; 
return scope; 
} 
console.log(getValue()); // > "Local" 
console.log(scope); // > "Global" 
この時点で同一スコープを探す 
いた!!
なぜundefined?
こういうイメージ 
var scope = "Global"; 
function getValue() { 
var scope; 
console.log(scope); // > undefined 
scope = "Local"; 
return scope; 
} 
console.log(getValue()); // > "Local" 
console.log(scope); // > "Global"
だから変数は最初に 
全部書きましょう
スコープチェーン 
による強力な機能
の前に 
ちょっと最新の話
ちなみに 
Javaなどにある 
ブロックスコープですが
ブロックスコープ 
var sum = 0; 
for (var i = 0; i < 10; i++) { 
sum += i; 
} 
console.log(sum); 
console.log(i);
ブロックスコープ 
var sum = 0; 
for (var i = 0; i < 10; i++) { 
sum += i; 
} 
console.log(sum); // > 45 
console.log(i); // > ??
ブロックスコープ 
var sum = 0; 
for (var i = 0; i < 10; i++) { 
sum += i; 
} 
console.log(sum); // > 45 
console.log(i); // > ReferenceError 10
ブロックスコープ 
var sum = 0; 
for (var i = 0; i < 10; i++) { 
sum += i; 
} 
console.log(sum); // > 45 
console.log(i); // > ReferenceError 10
ECMAScript6の新機能 
letでできるよ
ブロックスコープ 
var sum = 0; 
for (let i = 0; i < 10; i++) { 
sum += i; 
} 
console.log(sum); // > 45 
console.log(i); // > ReferenceError
戻ります
スコープチェーン 
による強力な機能
クロージャ
クロージャ 
“引数以外の変数を実行時の環境ではなく、 
自身が定義された環境(静的スコープ)に 
おいて解決することを特徴とする。” 
– by Wikipedia
var a = “GlobalA”; 
var b = “GlobalB”; 
function func1() { 
var b = “Func1B”; 
function func2() { 
var c = “Func2C”; 
console.log(c); // > “Func2C” 
console.log(b); // > “Func1B” 
console.log(a); // > “GlobalA” 
} 
func2(); 
} 
func1(); 
さっきのも 
クロージャ
クロージャの 
実践例
function counter() { 
var count = 0; 
return function() { 
count = count + 1; 
return count; 
} 
} 
var cnt = counter(); 
console.log(cnt()); // > 1 
console.log(cnt()); // > 2 
console.log(cnt()); // > 3 
変数の 
永続化
function counter() { 
var count = 0; 
return function() { 
count = count + 1; 
return count; 
} 
} 
var cnt = counter(); 
console.log(cnt()); // > 1 
console.log(cnt()); // > 2 
console.log(cnt()); // > 3 
変数の 
永続化 
ここで変数が束縛される
function counter() { 
var count = 0; 
return function() { 
count = count + 1; 
return count; 
} 
} 
var cnt = counter(); 
console.log(cnt()); // > 1 
console.log(cnt()); // > 2 
console.log(cnt()); // > 3 
変数の 
永続化 
束縛されたままなので 
値がインクリメントされる
即時関数
普通の関数定義と実行 
function helloWorld() { 
alert("Hello, World!"); 
} 
helloWorld();
即時関数 
(function helloWorld() { 
alert("Hello, World!"); 
})(); 
定義後、即実行
メリット
グローバルスコープを 
汚さない
即時関数 
(function helloWorld() { 
alert("Hello, World!"); 
})(); 
helloWorld(); // > エラー
ということは 
関数名もいらない
即時関数 
無名関数 
(function() { 
alert("Hello, World!"); 
})();
どういう時に使うか
ファイル内の全コードを囲む 
(function() { 
var hoge = 1; 
function fuga() { 
console.log(hoge); 
} 
fuga(); 
})();
なにがうれしい?
グローバルスコープを 
汚さない
同一ページで 
複数JSファイルを 
読み込んでも 
他のJSを壊さない
(function() { 
// ここに自分の 
//JavaScriptコードを書く 
})();
(function() { 
// ここに自分の 
//JavaScriptコードを書く 
})(); 
マナーとして覚えてください
fin

Mais conteúdo relacionado

Mais procurados

Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理Naoyuki Kakuda
 
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)t-sin
 
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common LispIntegral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lispfukamachi
 
Ductモジュール入門
Ductモジュール入門Ductモジュール入門
Ductモジュール入門Kent Ohashi
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」de:code 2017
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.specKent Ohashi
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6TanUkkii
 
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったかm2ym
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数ztyper
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Yuichi Sakuraba
 
PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法Yosuke Onoue
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 

Mais procurados (20)

Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理
 
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)
 
GraphQL入門
GraphQL入門GraphQL入門
GraphQL入門
 
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common LispIntegral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lisp
 
Ductモジュール入門
Ductモジュール入門Ductモジュール入門
Ductモジュール入門
 
08
0808
08
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.spec
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
 
PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
ALPSチュートリアル(5) ALPS Python入門
ALPSチュートリアル(5) ALPS Python入門ALPSチュートリアル(5) ALPS Python入門
ALPSチュートリアル(5) ALPS Python入門
 

Semelhante a Miyazaki.js vol.1 スコープの話

JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文Appresso Engineering Team
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
クロージャー
クロージャークロージャー
クロージャー1000 VICKY
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Flow.js
Flow.jsFlow.js
Flow.jsuupaa
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
Gulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くするGulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くするHayashi Yuichi
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehimeEigoro Yamamura
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理Yuto Matsukubo
 

Semelhante a Miyazaki.js vol.1 スコープの話 (20)

JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
クロージャー
クロージャークロージャー
クロージャー
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Flow.js
Flow.jsFlow.js
Flow.js
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
JVM-Reading-ParalleGC
JVM-Reading-ParalleGCJVM-Reading-ParalleGC
JVM-Reading-ParalleGC
 
Jvm reading-parallel gc
Jvm reading-parallel gcJvm reading-parallel gc
Jvm reading-parallel gc
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
Gulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くするGulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くする
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehime
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理
 

Miyazaki.js vol.1 スコープの話