Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JavaScript Course at Arzano Royal Institute of ...

JavaScript Course at Arzano Royal Institute of Magic

JavaScriptのスコープの基礎と、記号のみを使った数の表現について。JavaScriptの初学者向け

homuler

April 28, 2017
Tweet

More Decks by homuler

Other Decks in Programming

Transcript

  1. Q. B の宣言をコメントアウトすると・・ サンプルコード 実行結果 function foo(a) { // "use

    strict"; b = a; return a + b; } // var b = 1; console.log(foo(2)); 4 window.b = 2 // undefined -> 2
  2. Q. STRICT MODE だと・・ サンプルコード 実行結果 function foo(a) { 'use

    strict'; b = a; return a + b; } // var b = 1; console.log(foo(2)); ReferenceError // 実行時
  3. SCOPE の原理 1. コンパイル時に、コードの実行箇所ごとに有効な変数のマップが構成される 2. 変数宣言を見つけると、Compiler がScope を参照 3. Scope

    に未登録の場合、新たに変数を登録する 4. 変数を見つけた際は、Scope に登録されているか参照 5. 見つからない場合は、上位Scope を順番に参照
  4. Q. 逆パターンだと・・ サンプルコード 実行結果 function foo(a) { // "use strict";

    a = b; return a; } // var b = 1; console.log(foo(2)); ReferenceError // RHS lookup 失敗
  5. FUNCTION SCOPE の例 サンプルコード function foo() { var a =

    1; function bar(a) { // a shadowing // i 見 console.log(a + i); } for (var i = 1; i < 10; i++) { bar(i); } } foo();
  6. Q. VAR を使った宣言 サンプルコード 実行結果 function foo() { console.log(a); a

    = 2; var a = 1; console.log(a); console.log(window.a); } foo(); undefined 1 undefined
  7. A. VAR を使った宣言 サンプルコード function foo() { var a; console.log(a);

    a = 2; a = 1; console.log(a); console.log(window.a); } foo();
  8. 宣言の競合 サンプルコード 実行結果 foo(); var foo; function foo() { console.log(1);

    } foo = function() { console.log(2); } function foo() { console.log(3); } 3
  9. ブロック内の宣言 サンプルコード 実行結果 foo(); var flag = true; if (flag)

    { function foo() { console.log(1); } } else { function foo() { console.log(2); } } 2
  10. BLOCK SCOPE (IF 文) サンプルコード 実行結果 if (foo) { var

    foo = false; } else { foo = true; } console.log(foo); true
  11. IIFE サンプルコード サンプルコード(正) クロージャは使えると今でも便利 for (var i = 1; i

    < 5; i++) { setTimeout(() => { console.log(i); }, 1000 * i); } for (var i = 1; i < 5; i++) { (function (j) { setTimeout(() => { console.log(j); }, 1000 * j); })(i); }
  12. BLOCK SCOPE (FOR 文) サンプルコード for (let i = 1;

    i < 5; i++) { // 実質for 内 毎回新 i 宣言 setTimeout(() => { console.log(i); }, 1000 * i); }
  13. 暗黙の型変換について 詳細は別冊テキストで学習くださいm(_ _)m console.log(10 - '1'); // 9 console.log(10 -

    '1' + '1'); // '91' console.log(10 - '1' - '1'); // 8 console.log(10 - ('1' + '1')); // -1
  14. STEP7 括弧 実行結果 [!![] + !![] + !![]] * [!![]

    + !![]] + !![] + [+![]] - !![] // [3] * [2] 6 // + true + [0] - true // '10' - 1 9
  15. STEP8 指数 実行結果 +[+!![] + [!![] + []][+![]][!![] + !![]

    + !![]] + [+!![]]] // +[1 + ['true'][0][3] + [1]] = +['1e1'] 10
  16. STEP9 ??? 実行結果 +[+!![] + [!![] + []][+![]][!![] + !![]

    + !![]] + [!![] + !![]] + [+![]]] // +[1 + ['true'][0][3] + [2] + [0]] 100000000000000000000