SlideShare a Scribd company logo
1 of 15
SCIVONE Tech Talks
#0
マルチデバイス対応を踏まえたフロントエンド開発事情
Hika Maeng  株式会社クイン代表取締役、 Bsidesoft CEO

1
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

本日のアウトライン

実務面でのオープンソースライブラリの課題
コーディング戦略
JavaScript の特徴を活かそう
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

実務面でのオープンソースライブラリの課題

1

継続的なブラウザの更新に対応できない

初期開発時

時間経過

2011, IE9, jQuery 1.3

2013, IE10, jQuery 1.9
jQuery を更新する
API の不一致、変更が原因で、
サイト全体を見直す必要が出てくる

jQuery を更新しない
新しいブラウザの特性に対応しておらず、
パフォーマンスとセキュリティの問題が発生
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

実務面でのオープンソースライブラリの課題

2

ブラウザの互換性が保障されない

IE8

IE9

IE10

12.44%

22.27%

15.67%
HTML5 標準対応を機に、ほとんどの古いブラウザのサポートが終了
たとえば、 jQuery が Internet Explorer 6 ~ 8 をサポートするのは 1.9 まで。

しかし現実には、無視できないシェア

statCounter:http://gs.statcounter.com/#browser_version-JP-monthly-201301-201310-bar
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

実務面でのオープンソースライブラリの課題

3

モバイルブラウザ対応
1. iPhone - 8
Safari - 5.x, 6.x, 7.x
Opera, mini,
Chrome, Firefox
Facebook
2. iPad – 8
3. Andorid - 30
NativeBrowser – 30over,
Chrome
4. smartTV, Android Tablet – 10over

50

over
iconfinder.com
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

コーディング戦略
ラッピング ライブラリを包括するレイヤーを構成して使用
$( ‘#stage’ ).css( ‘width’, 30 );

function css( $selector, $k, $v ){
$( $selector ).css( $k, $v );
}

function css( $selector, $k, $v ){
var dom = Sizzle( $selector );
dom.style[$k] = $v + ‘px’;
}

css( ‘#stage’, ‘width’, 30 );
css( ‘#stage’, ‘width’, 30 );

実際の具現化には
オープンソースの課題
ライセンス問題、技術サポート、機能の追加、制御されていない開発チーム
自前で実装する場合の課題
膨大な開発コスト、深い知識、メンテナンスコスト
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう

1

DOM Wrapper

2

Hash Map

3

Prototype

4

Scope

7
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう

1

DOM Wrapper

HTML System

HTML System
Tag Element
<canvas id=”c1”>

<style id=”s1”>

c1 = document.getElementById('c1');
context = c1.getContext('2d');
context.draw(..);

s1 = document.getElementById('s1');
sheet = s1.sheet;
sheet.rules.insertRule(...);

Tag Element

Context Object
Context
Object
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう
keys

2

hash
function

hashes
00

Hash Map

John Smith

01
02

Lisa Smith
Sam Doe

03
04

自由に Key 、 Value の追加削除ができる
00

var temp = {};
temp.newKey = 3;
delete temp.newKey;

JavaScript 内のすべてのオブジェクトは HashMap

オブジェクトではないもの: Primitive
参照されずにコピーされる
string, number, boolean, NaN, undefined, null

var temp = function(){};
temp.a =3;
temp = new Date;
temp.b = 3;
temp = [3,4,5];
temp.c = 3
http://en.wikipedia.org/wiki/Hash_table
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう

3

Prototype
クラスがない
共有リソース(メソッド、フィールド)を保管する場所がない

関数の特定のキーを共有するリソースのアーカイブに使用
var temp = function(){};
temp.prototype = {};

prototype keyChain
new でオブジェクトを作成すると、指定された関数の prototype を共有する
var func = function(){};
func.prototype = {
test:function(){}
}

var a = {};
a.__proto__ = func.prototype;
var temp= func.apply( a, arguments );
if( typeof temp == 'object' ) a = temp;

var a = new func;

a.test();
a['test'] == undefined a.__proto__.test == func.prototype.test
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう

4

Scope
関数の実行時に、
Execution Context ( EC )を作成

function test( a, b ){
var c, d;
}

test( 3, 4, 5 );

testEC1 = {
this:window,
arguments:[3,4,5],
a:3, b:4,
c:undefined, d:undefined,
parent:??
}

EC : Execution Context (実行コンテキスト)

test( 6 );

testEC2 = {
this:window,
arguments:[6,undefined],
a:6, b:undefined,
c:undefined, d:undefined,
parent:??
}
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう

4

Scope
EC 生成をコンパイラが処理するための設計図 ― 関数の Scope
function test( a, b ){
var c, d;
}
test.scope = {
arguments:['a','b'],
locals:['c','d'],
parent:??
}

arg = scope.arguments;
for( i = 0 ; i < arg.length ; i++ ){
key = arg[i];
testEC1[key] = testEC1.arguments[i];
}
locals = scope.locals;
for( i = 0 ; i < locals.length ; i++ ){
key = locals[i];
testEC1[key] = undefined;
}
testEC1.parent = scope.parent;

EC : Execution Context (実行コンテキスト)

test.call( {k:3}, 3, 4, 5 );
testEC1 = {
this:{k:3},
arguments:[3,4,5],
a:3, b:4,
c:undefined, d:undefined,
parent:??
}
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう

4

Scope
Parent ― 環境関数の EC
function test( a, b ){
var c, d;
}
function global(){
function test( a, b ){
var c, d;
}
}
global();

EC : Execution Context (実行コンテキスト)

function environmentalFunction(){
function concreateFunction(){
}
concreateFunction.scope.parent = environmentalFunction_EC1;
}
environmentalFunction();
environmentalFunction_EC1 = {...};
SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情

JavaScript の特徴を活かそう

4

Scope
Scope Key Chain

function ev(){
var data = "hello";
return function c( $data ){
console.log( 'origin:', data,
'new:', $data );
data = $data;
}
}
var c = ev();
c( "aloha" );
c( "bye" );

var c = ev();

c( "aloha" );

c( "bye" );

ev_EC = {
this:window,
arguments:[],
data:'hello'
} = c.scope.parent

c_EC1 = {
this:window,
arguments:["aloha"],
$data:'aloha',
parent:c.scope.parent
}

c_EC2 = {
this:window,
arguments:["bye"],
$data:'bye',
parent:c.scope.parent
}

c_EC1.data == undefined
c_EC1.parent.data = 'hello'
origin: hello, new: aloha
c_EC1.parent.data = c_EC1.$data
= 'aloha'
ご清聴ありがとうございました。
Enjoy Your Happy Dev Life!

15

More Related Content

What's hot

Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化
Kenichi Kambara
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
urasandesu
 

What's hot (20)

Visual Studio Code #phpcon2015
Visual Studio Code #phpcon2015Visual Studio Code #phpcon2015
Visual Studio Code #phpcon2015
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装
 
PHP agile test tips
PHP agile test tipsPHP agile test tips
PHP agile test tips
 
Pythonで始めるWebアプリケーション開発
Pythonで始めるWebアプリケーション開発Pythonで始めるWebアプリケーション開発
Pythonで始めるWebアプリケーション開発
 
20151021 cookpad talk_test_engineer
20151021 cookpad talk_test_engineer20151021 cookpad talk_test_engineer
20151021 cookpad talk_test_engineer
 
【19-B-4】 そろそろ俺たちの本気を見せてやるぜ!~ マイクロソフトとOSSごった煮 DevOps 衝撃デモシリーズ!
【19-B-4】 そろそろ俺たちの本気を見せてやるぜ!~ マイクロソフトとOSSごった煮 DevOps 衝撃デモシリーズ!【19-B-4】 そろそろ俺たちの本気を見せてやるぜ!~ マイクロソフトとOSSごった煮 DevOps 衝撃デモシリーズ!
【19-B-4】 そろそろ俺たちの本気を見せてやるぜ!~ マイクロソフトとOSSごった煮 DevOps 衝撃デモシリーズ!
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
 
Mizukiryu refactering-20110821
Mizukiryu refactering-20110821Mizukiryu refactering-20110821
Mizukiryu refactering-20110821
 
Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
ぼくのかんがえた iOSテスト戦略
ぼくのかんがえた iOSテスト戦略ぼくのかんがえた iOSテスト戦略
ぼくのかんがえた iOSテスト戦略
 
iOSアプリケーションの Unit Test
iOSアプリケーションの Unit TestiOSアプリケーションの Unit Test
iOSアプリケーションの Unit Test
 
Klocworkのご紹介
Klocworkのご紹介Klocworkのご紹介
Klocworkのご紹介
 
Modern .NET
Modern .NETModern .NET
Modern .NET
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 
【Agile Forum in Gifu】 Visual Studio 2010 でみる、アジャイル開発における開発支援ツールの活用
【Agile Forum in Gifu】 Visual Studio 2010 でみる、アジャイル開発における開発支援ツールの活用【Agile Forum in Gifu】 Visual Studio 2010 でみる、アジャイル開発における開発支援ツールの活用
【Agile Forum in Gifu】 Visual Studio 2010 でみる、アジャイル開発における開発支援ツールの活用
 
Session11 - LabVIEW NXG Training Course
Session11 - LabVIEW NXG Training CourseSession11 - LabVIEW NXG Training Course
Session11 - LabVIEW NXG Training Course
 

Similar to tech talk about JS #0

ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
Akira Inoue
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
Atsuhiro Kubo
 
How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2 How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2
ichikaway
 
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
智治 長沢
 

Similar to tech talk about JS #0 (20)

ボット開発でも DevOps! BotBuilder のテスト手法
ボット開発でも DevOps! BotBuilder のテスト手法ボット開発でも DevOps! BotBuilder のテスト手法
ボット開発でも DevOps! BotBuilder のテスト手法
 
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
 
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門
 
How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2 How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2
 
[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント
[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント
[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント
 
Kubernetes 導入から始める DevOps について
Kubernetes 導入から始める DevOps についてKubernetes 導入から始める DevOps について
Kubernetes 導入から始める DevOps について
 
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
 
でぶさみ夏2013 キーノート オレンジレンジャーの資料
でぶさみ夏2013 キーノート オレンジレンジャーの資料でぶさみ夏2013 キーノート オレンジレンジャーの資料
でぶさみ夏2013 キーノート オレンジレンジャーの資料
 
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】 Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
【JaSST'11 Tokyo】 テスト イノベーション
【JaSST'11 Tokyo】 テスト イノベーション【JaSST'11 Tokyo】 テスト イノベーション
【JaSST'11 Tokyo】 テスト イノベーション
 
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
DEV-003_新しく生まれ変わったデータ アクセス テクノロジ ~Entity Framework Core 1.0 の全貌~
DEV-003_新しく生まれ変わったデータ アクセス テクノロジ ~Entity Framework Core 1.0 の全貌~DEV-003_新しく生まれ変わったデータ アクセス テクノロジ ~Entity Framework Core 1.0 の全貌~
DEV-003_新しく生まれ変わったデータ アクセス テクノロジ ~Entity Framework Core 1.0 の全貌~
 
バグ0の資産を積み上げるための証明駆動開発入門
バグ0の資産を積み上げるための証明駆動開発入門バグ0の資産を積み上げるための証明駆動開発入門
バグ0の資産を積み上げるための証明駆動開発入門
 
JenkinsとSeleniumの活用事例
JenkinsとSeleniumの活用事例JenkinsとSeleniumの活用事例
JenkinsとSeleniumの活用事例
 
世界をすこしだけ前に進めるということ
世界をすこしだけ前に進めるということ世界をすこしだけ前に進めるということ
世界をすこしだけ前に進めるということ
 
Mobile-first, Cloud-first のその先へ ~ Microsoft が描く Web/Mobile の未来
Mobile-first, Cloud-first のその先へ ~ Microsoft が描く Web/Mobile の未来Mobile-first, Cloud-first のその先へ ~ Microsoft が描く Web/Mobile の未来
Mobile-first, Cloud-first のその先へ ~ Microsoft が描く Web/Mobile の未来
 

tech talk about JS #0

  • 2. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 本日のアウトライン 実務面でのオープンソースライブラリの課題 コーディング戦略 JavaScript の特徴を活かそう
  • 3. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 実務面でのオープンソースライブラリの課題 1 継続的なブラウザの更新に対応できない 初期開発時 時間経過 2011, IE9, jQuery 1.3 2013, IE10, jQuery 1.9 jQuery を更新する API の不一致、変更が原因で、 サイト全体を見直す必要が出てくる jQuery を更新しない 新しいブラウザの特性に対応しておらず、 パフォーマンスとセキュリティの問題が発生
  • 4. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 実務面でのオープンソースライブラリの課題 2 ブラウザの互換性が保障されない IE8 IE9 IE10 12.44% 22.27% 15.67% HTML5 標準対応を機に、ほとんどの古いブラウザのサポートが終了 たとえば、 jQuery が Internet Explorer 6 ~ 8 をサポートするのは 1.9 まで。 しかし現実には、無視できないシェア statCounter:http://gs.statcounter.com/#browser_version-JP-monthly-201301-201310-bar
  • 5. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 実務面でのオープンソースライブラリの課題 3 モバイルブラウザ対応 1. iPhone - 8 Safari - 5.x, 6.x, 7.x Opera, mini, Chrome, Firefox Facebook 2. iPad – 8 3. Andorid - 30 NativeBrowser – 30over, Chrome 4. smartTV, Android Tablet – 10over 50 over iconfinder.com
  • 6. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 コーディング戦略 ラッピング ライブラリを包括するレイヤーを構成して使用 $( ‘#stage’ ).css( ‘width’, 30 ); function css( $selector, $k, $v ){ $( $selector ).css( $k, $v ); } function css( $selector, $k, $v ){ var dom = Sizzle( $selector ); dom.style[$k] = $v + ‘px’; } css( ‘#stage’, ‘width’, 30 ); css( ‘#stage’, ‘width’, 30 ); 実際の具現化には オープンソースの課題 ライセンス問題、技術サポート、機能の追加、制御されていない開発チーム 自前で実装する場合の課題 膨大な開発コスト、深い知識、メンテナンスコスト
  • 7. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう 1 DOM Wrapper 2 Hash Map 3 Prototype 4 Scope 7
  • 8. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう 1 DOM Wrapper HTML System HTML System Tag Element <canvas id=”c1”> <style id=”s1”> c1 = document.getElementById('c1'); context = c1.getContext('2d'); context.draw(..); s1 = document.getElementById('s1'); sheet = s1.sheet; sheet.rules.insertRule(...); Tag Element Context Object Context Object
  • 9. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう keys 2 hash function hashes 00 Hash Map John Smith 01 02 Lisa Smith Sam Doe 03 04 自由に Key 、 Value の追加削除ができる 00 var temp = {}; temp.newKey = 3; delete temp.newKey; JavaScript 内のすべてのオブジェクトは HashMap オブジェクトではないもの: Primitive 参照されずにコピーされる string, number, boolean, NaN, undefined, null var temp = function(){}; temp.a =3; temp = new Date; temp.b = 3; temp = [3,4,5]; temp.c = 3 http://en.wikipedia.org/wiki/Hash_table
  • 10. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう 3 Prototype クラスがない 共有リソース(メソッド、フィールド)を保管する場所がない 関数の特定のキーを共有するリソースのアーカイブに使用 var temp = function(){}; temp.prototype = {}; prototype keyChain new でオブジェクトを作成すると、指定された関数の prototype を共有する var func = function(){}; func.prototype = { test:function(){} } var a = {}; a.__proto__ = func.prototype; var temp= func.apply( a, arguments ); if( typeof temp == 'object' ) a = temp; var a = new func; a.test(); a['test'] == undefined a.__proto__.test == func.prototype.test
  • 11. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう 4 Scope 関数の実行時に、 Execution Context ( EC )を作成 function test( a, b ){ var c, d; } test( 3, 4, 5 ); testEC1 = { this:window, arguments:[3,4,5], a:3, b:4, c:undefined, d:undefined, parent:?? } EC : Execution Context (実行コンテキスト) test( 6 ); testEC2 = { this:window, arguments:[6,undefined], a:6, b:undefined, c:undefined, d:undefined, parent:?? }
  • 12. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう 4 Scope EC 生成をコンパイラが処理するための設計図 ― 関数の Scope function test( a, b ){ var c, d; } test.scope = { arguments:['a','b'], locals:['c','d'], parent:?? } arg = scope.arguments; for( i = 0 ; i < arg.length ; i++ ){ key = arg[i]; testEC1[key] = testEC1.arguments[i]; } locals = scope.locals; for( i = 0 ; i < locals.length ; i++ ){ key = locals[i]; testEC1[key] = undefined; } testEC1.parent = scope.parent; EC : Execution Context (実行コンテキスト) test.call( {k:3}, 3, 4, 5 ); testEC1 = { this:{k:3}, arguments:[3,4,5], a:3, b:4, c:undefined, d:undefined, parent:?? }
  • 13. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう 4 Scope Parent ― 環境関数の EC function test( a, b ){ var c, d; } function global(){ function test( a, b ){ var c, d; } } global(); EC : Execution Context (実行コンテキスト) function environmentalFunction(){ function concreateFunction(){ } concreateFunction.scope.parent = environmentalFunction_EC1; } environmentalFunction(); environmentalFunction_EC1 = {...};
  • 14. SCIVONE Tech Talks #0 マルチデバイス対応を踏まえたフロントエンド開発事情 JavaScript の特徴を活かそう 4 Scope Scope Key Chain function ev(){ var data = "hello"; return function c( $data ){ console.log( 'origin:', data, 'new:', $data ); data = $data; } } var c = ev(); c( "aloha" ); c( "bye" ); var c = ev(); c( "aloha" ); c( "bye" ); ev_EC = { this:window, arguments:[], data:'hello' } = c.scope.parent c_EC1 = { this:window, arguments:["aloha"], $data:'aloha', parent:c.scope.parent } c_EC2 = { this:window, arguments:["bye"], $data:'bye', parent:c.scope.parent } c_EC1.data == undefined c_EC1.parent.data = 'hello' origin: hello, new: aloha c_EC1.parent.data = c_EC1.$data = 'aloha'