Help us understand the problem. What is going on with this article?

withによるブロックスコープ構文

More than 5 years have passed since last update.

JavaScriptでブロックスコープと言えば即時関数(function(){ ... })()ですが、もう一つwithを使った構文があります。しかし動作がすさまじく遅いので使いどころは微妙です。

withスコープ(あらかじめローカル変数をすべて宣言)
var a = "global";
with ({a:"local"}) {
  console.log(a); //"local"
  with ({a:"local2"}) {  /* 入れ子にできる */
    console.log(a); //"local2"
  }
  console.log(a); //"local"
}
console.log(a); //"global"

動的にローカル変数を追加したい場合はこんな書き方でいけます。varではなくmy.~でローカル変数を宣言します。

無名コンストラクタを併用して動的にローカル変数を追加できるようにした
var a = "global";
with (new function(){this.my=this}) {
  console.log(a); //"global"
  my.a = "local"; //ローカル変数を追加した
  console.log(a); //"local"
}

console.log(a); //"global" ブロックを抜けたのでグローバル変数に戻る
Hiraku
PHP, Go界隈をうろうろしています。最近はgRPCと戦ってる。 特に明示していなければ、記事中のソースコード片は `CC-0 1.0` とします。出典表示無しで自由にコピペして頂いて構いません。 ただ、記事自体をコピペされるのは嫌なので、ソースコード部分以外の文章は通常通り全ての著作権を私が保持するものとします。 引用を超える範囲のコピペは止めて下さい。
http://blog.tojiru.net/
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away