せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【JavaScript 】【Chrome】let変数。chromeの"extended mode"

 
■topic summary
stude about "let" in JavaScript.and "extended mode" which is used in chrome.

 
長くなってきたので、以前の記事から分けました。

 

ブロックスコープ変数let

let宣言で宣言した変数はブロックスコープです。

 
でもJavaScript の独自拡張らしく(ECMAScript第五版にはない)、
chromeではエラー。

let s=10;
SyntaxError: Unexpected identifier

 
(追記)
AJさんからコメントをもらったよ!
f:id:sekaiya:20131102194355j:plain

 
AJさんすごいね。なんでこんなに詳しいのかな。
AJって何だろう。JはJavaScriptだとしても、Aってなんだろう。。
「厚焼き」とか?
厚焼きJavaScript

 
ESとはECMAScriptのこと。

■ECMAScript6のサイトにてletが提案されている

Proposals
let, the new var but block-scoped and with better use-before-set semantics (dherman,markm)

http://wiki.ecmascript.org/doku.php?id=harmony

 
Wikiを確認してみる。

JavaScript は1.7からlet機能が追加
f:id:sekaiya:20131102195429j:plain
http://en.wikipedia.org/wiki/ECMAScript

 
■JavaScript1.7 対応の各ブラウザVer 
IEは11から対応。

ブロック スコープ変数
let と const という新しいキーワードを使うと、宣言する変数のスコープを変数を宣言したブロックに限定できます

http://msdn.microsoft.com/ja-jp/library/ie/dn342892(v=vs.85).aspx

しかしこの表はどう見ればいいんだろう。
f:id:sekaiya:20131102200812j:plain
http://en.wikipedia.org/wiki/JavaScript
FireFoxJavaScript 1.7がVer2.0から対応と読めるけど、
実際はまだ1.7は未対応の様子。

f:id:sekaiya:20131102200909j:plain
https://developer.mozilla.org/en-US/docs/Web/JavaScript/ECMAScript_6_support_in_Mozilla


たしかに、手元のFireFoxではletが認識されない。
f:id:sekaiya:20131102200256j:plain
f:id:sekaiya:20131102200449j:plain


 

フラグを有効にしたChrome

ってなんだろう?

chrome://flags/

で内部フラグを設定できるみたい!初めて知った。
 
f:id:sekaiya:20131102201534j:plain
このフラグだね。
「harmony」はES6の略称だから。

うーん。
フラグをONにして再起動しても、

C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --js-flags=--use-strict

起動オプションをつけても、
letが認識されない。。
f:id:sekaiya:20131102204747j:plain

うーん。。?

 
(追記)
あらためてAJさんからコメントをもらったよ!
f:id:sekaiya:20131104090433j:plain
だって!
すごいね。詳しいね?なんでだろう!??!

"strict mode"でしか使えないのか。。?
でもエラーメッセージは

SyntaxError: Illegal let declaration outside extended mode

って出るんだよね。。"extended mode"って。

どういうことか調べてみよう。

extended modeとは

V8(chromeJavaScript エンジン)のソースglobals.h に解説が載っていた。

The extended mode is only available if the harmony flag is set. It is based on the 'strict mode' and adds new functionality to it.

https://code.google.com/p/v8/codesearch#v8/trunk/src/globals.h&q=%22extended%20mode%22&sq=package:v8&type=cs&l=381

なるほどね。
extended mode はstrict mode を包括したモードなんだね。
V8のLanguageMode には以下の3種類が存在するんだね。

enum LanguageMode {
  CLASSIC_MODE,
  STRICT_MODE,
  EXTENDED_MODE
};

 
謎が解けたところで、strict modeの使い方はmozillaに書いてある。

you're chrome code, or you've used the right <script type="">) and is strict mode code

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode

ふむふむ。。
<script type="">を明示しないといけないのか。

 

Chromeでletを使う

改めて纏めてみよう。
せっかくAJさんに教えてもらったし。

chromeのフラグを設定する

chrome://flags/ にて「JavaScript の試験運用機能を有効にする 」フラグをON。
f:id:sekaiya:20131102201534j:plain
「harmony」はES6の略称。

 

スクリプトを作成

<script type="">を明示したファイルを作成。
今はhtmlファイル。

"use strict"を先頭に書くことでstrictモードを宣言。
■aaajs.html

<script type="text/javascript">
"use strict";
{
 let hoge="kkK";
 console.log(hoge);
}
console.log(hoge);
</script>

 

ファイルの実行

f:id:sekaiya:20131104091946j:plain
f:id:sekaiya:20131104091951j:plain

できたー。
やったー。


 

今月19-21日の会議で仕様が固まる

ってなんだろうね?
さすがにこれは調べても分からなかった。
AJさんって何者なのかなー。。。厚焼きJavaScript 。。?