with
鿍奍;: ãã®æ©è½ã¯éæ¨å¥¨ã«ãªãã¾ãããã¾ã 対å¿ãã¦ãããã©ã¦ã¶ã¼ãããããããã¾ãããããã§ã«é¢é£ããã¦ã§ãæ¨æºããåé¤ããã¦ããããåé¤ã®æç¶ãä¸ã§ããããäºææ§ã®ããã ãã«æ®ããã¦ããå¯è½æ§ãããã¾ãã使ç¨ãé¿ããã§ããã°æ¢åã®ã³ã¼ãã¯æ´æ°ãã¦ãã ããããã®ãã¼ã¸ã®ä¸é¨ã«ããäºææ§ä¸è¦§è¡¨ãè¦ã¦å¤æãã¦ãã ããããã®æ©è½ã¯çªç¶åä½ããªããªãå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ããã
ã¡ã¢:
with æã®ä½¿ç¨ã¯æ¨å¥¨ããã¾ãããæ··ä¹±ãæããã°ãäºææ§åé¡ã®åå ã¨ãªãå¯è½æ§ããããæé©åãã§ããªããªãã峿 ¼ã¢ã¼ãã§ã¯ç¦æ¢ããã¦ããããã§ããæ¨å¥¨ãããä»£æ¿æ¡ã¯ãããããã£ãã¢ã¯ã»ã¹ããããªãã¸ã§ã¯ãã䏿夿°ã«å²ãå½ã¦ããã¨ã§ãã
with æã¯ãæã«å¯¾ããã¹ã³ã¼ããã§ã¼ã³ãæ¡å¼µãã¾ãã
æ§æ
with (expression)
statement
expression-
æãè©ä¾¡ããã¨ãã«ä½¿ãããã¹ã³ã¼ããã§ã¼ã³ã«ãä¸ãããããªãã¸ã§ã¯ãã追å ãã¾ãããªãã¸ã§ã¯ãã®å¨ãã®æ¬å¼§ã¯å¿ é ã§ãã
statement-
ä»»æã®æãè¤æ°ã®æãå®è¡ããããã«ã¯ããããã®æãã°ã«ã¼ãåããããã«ãããã¯æï¼
{ ... }ï¼ã使ã£ã¦ãã ããã
解説
èå¥åã«ã¯ã修飾èå¥åã¨é修飾èå¥åã® 2 種é¡ãããã¾ããé修飾èå¥åã¯ãã©ãããæ¥ãã®ãã示ããªããã®ã§ãã
foo; // é修飾èå¥å
foo.bar; // bar ã¯ä¿®é£¾èå¥å
é常ãé修飾èå¥åã¯ããã®ååãæã¤å¤æ°ãã¹ã³ã¼ããã§ã¼ã³ã§æ¤ç´¢ãããã¨ã§è§£æ±ºãã修飾èå¥åã¯ããã®ååãæã¤ããããã£ããªãã¸ã§ã¯ãã®ãããã¿ã¤ããã§ã¼ã³ã§æ¤ç´¢ãããã¨ã§è§£æ±ºãã¾ãã
const foo = { bar: 1 };
console.log(foo.bar);
// foo ã¯å¤æ°ã¨ãã¦ã¹ã³ã¼ããã§ã¼ã³å
ã§è¦ã¤ããã
// bar 㯠foo ã®ä¸ã§ããããã£ã¨ãã¦è¦ã¤ããã
ä¾å¤ã¨ãã¦ãã°ãã¼ãã«ãªãã¸ã§ã¯ãã¯ãã¹ã³ã¼ããã§ã¼ã³ã®æä¸ä½ã«ä½ç½®ãããã®ããããã£ã¯èªåçã«ã°ãã¼ãã«å¤æ°ã«ãªãã修飾åãªãã§åç §ãããã¨ãã§ãã¾ãã
console.log(globalThis.Math === Math); // true
with æã¯ããã®ææ¬ä½ã®è©ä¾¡ã®éããã®ã¹ã³ã¼ããã§ã¼ã³ã®å
é ã«ãä¸ãããããªãã¸ã§ã¯ãã追å ãã¾ãããã¹ã¦ã®é修飾åã¯ãä¸ä½ã¹ã³ã¼ããã§ã¼ã³ã§æ¤ç´¢ãããåã«ãã¾ããªãã¸ã§ã¯ãå
ã§ï¼in ãã§ãã¯ãä»ãã¦ï¼æ¤ç´¢ããã¾ãã
é修飾åç
§ããªãã¸ã§ã¯ãã®ã¡ã½ãããåç
§ããå ´åããã®ã¡ã½ããã¯ãã®ãªãã¸ã§ã¯ãã this å¤ã¨ãã¦å¼ã³åºããããã¨ã«æ³¨æãã¦ãã ããã
with ([1, 2, 3]) {
console.log(toString()); // 1,2,3
}
ãªãã¸ã§ã¯ã㯠[Symbol.unscopables] ããããã£ãæã¤ãã¨ãã§ãã¾ãããããã¯ã¹ã³ã¼ããã§ã¼ã³ã«ï¼å¾æ¹äºææ§ã®ããã«ï¼è¿½å ãã¦ã¯ãªããªãããããã£ã®ãªã¹ããå®ç¾©ãããã®ã§ãã詳細㯠Symbol.unscopables ã®ããã¥ã¡ã³ããåç
§ãã¦ãã ããã
with æã使ç¨ããçç±ã¯ã䏿夿°ã 1 ã¤ç¯ç´ããããã¨ãé·ããªãã¸ã§ã¯ãåç
§ãç¹°ãè¿ããã¨ãé¿ããããã«ãã¡ã¤ã«ãµã¤ãºã縮å°ããããã§ããããããwith æã好ã¾ãããªãçç±ã¯ãã£ã¨ããããããã¾ãã
-
ããã©ã¼ãã³ã¹:
withæã¯ããã¹ã¦ã®ååæ¤ç´¢ã«ããã¦ãæå®ãããªãã¸ã§ã¯ããæåã«æ¤ç´¢ãããã¨ãå¼·å¶ãã¾ãããããã£ã¦ãæå®ãããªãã¸ã§ã¯ãã®ã¡ã³ãã¼ã§ãªãèå¥åã¯ãã¹ã¦ãwithãããã¯ã®ä¸ã§è¦ã¤ããã®ãããé ããªãã¾ããããã«ããªããã£ãã¤ã¶ã¼ã¯ããããã®é修飾èå¥åãä½ãåç §ãã¦ããã®ãã«ã¤ãã¦ä»®å®ãããã¨ãã§ããªããããèå¥åã使ç¨ãããã³ã«åãããããã£ã®æ¤ç´¢ãç¹°ãè¿ããªããã°ãªãã¾ããã -
å¯èªæ§:
withæã«ããã人éã®èªã¿æã JavaScript ã³ã³ãã¤ã©ã¼ã«ã¨ã£ã¦ã修飾ããã¦ããªãååãã¹ã³ã¼ããã§ã¼ã³ã§è¦ã¤ãããã©ãããè¦ã¤ããã¨ãããã©ã®ãªãã¸ã§ã¯ãã§è¦ã¤ãããããã夿ããã®ãé£ãããªãã¾ãã以ä¸ã®ä¾ãè¦ã¦ãã ãããjsfunction f(x, o) { with (o) { console.log(x); } }fã®å®ç¾©ã ããè¦ã¦ããã¨ãwithæ¬ä½ã®xãä½ãåç §ãã¦ããã®ãããããã¾ãããfãå¼ã³åºããã¦åãã¦ãxão.xã§ããããfã®æåã®å½¢å¼å¼æ°ã§ãããã夿ãããã¨ãã§ãã¾ããããã2 ã¤ç®ã®å¼æ°ã¨ãã¦æ¸¡ããªãã¸ã§ã¯ãã§xãå®ç¾©ãå¿ãã¦ããã¨ã©ã¼ã¯çºçãã¾ãããããã®ä»£ããã«äºæãã¬çµæãçºçãã¾ããã¾ãããã®ãããªã³ã¼ããå®éã«ã©ã®ãããªæå³ãæã£ã¦ããã®ãã䏿ã§ãã -
åæ¹äºææ§:
withã使ç¨ããã³ã¼ãã¯ãåæ¹äºææ§ããªãå¯è½æ§ãããã¾ããç¹ã«ãå°æ¥çã«è¤æ°ã®ããããã£ãæã¤ããã«ãªããããããªãããã¬ã¼ã³ãªãã¸ã§ã¯ã以å¤ã§ä½¿ç¨ããå ´åã§ããæ¬¡ã®ãããªä¾ãèãã¦ã¿ã¾ããããjsfunction f(foo, values) { with (foo) { console.log(values); } }ECMAScript 5 ç°å¢ã§
f([1, 2, 3], obj)ãå¼ã³åºãã¨ãwithæã®ä¸ã«ããvaluesã®åç §å ã¯objã«è§£æ±ºããã¾ããã¨ããããECMAScript 2015 ã§ã¯valuesããããã£ãArray.prototypeã«å°å ¥ããã¾ãã (ãã£ã¦ããã¹ã¦ã®é åã§ä½¿ç¨ã§ãã¾ã)ãå¾ã£ã¦ãç°å¢ãæ´æ°ããã¨ãwithæã®å é¨ã«ããvaluesã®åç §å ã¯[1, 2, 3].valuesã«è§£æ±ºãããããã«ãªãããã°ãå¼ãèµ·ããå¯è½æ§ãããã¾ãããã®å ·ä½çãªä¾ã§ã¯ã
valuesã¯Array.prototype[Symbol.unscopables]ã«ãã£ã¦ã¹ã³ã¼ãä¸å¯ã¨å®ç¾©ããã¦ããã®ã§ããã¯ãvalues弿°ã«æ£ãã解決ã ãã¾ãããããã¹ã³ã¼ãä¸å¯ã¨å®ç¾©ããã¦ããªããã°ããããã°ãå°é£ãªèª²é¡ã«ãªãã®ã¯ç®ã«è¦ãã¦ãã¾ãã
ä¾
>with ã®ä½¿ç¨
次㮠with æã¯ãMath ãªãã¸ã§ã¯ããæ¢å®ã®ãªãã¸ã§ã¯ãã§ããã¨æå®ãã¦ãã¾ããwith æå
ã®è¤æ°ã®æã¯ããªãã¸ã§ã¯ããæå®ãããã¨ãªãã PI ããããã£ã cos ã¡ã½ãããããã³ sin ã¡ã½ãããåç
§ãã¦ãã¾ããJavaScript ã¯ããããã®åç
§ã«å¯¾ã㦠Math ãªãã¸ã§ã¯ããä»®å®ãã¾ãã
let a, x, y;
const r = 10;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
ããããã£ãç¾å¨ã®ã¹ã³ã¼ãã«æ§é åè§£ã㦠with æãé¿ãã
é常ãããããã£ã®æ§é åè§£ã«ãã£ã¦ with ã使ç¨ããã®ãé¿ãããã¨ãã§ãã¾ããããã§ã¯ãwith ãä½åãªã¹ã³ã¼ããä½ãåä½ã模å£ããããã«ä½åãªãããã¯ã使ãã¦ãã¾ãããå®éã®ä½¿ç¨ã§ã¯ãé常ã¯ãã®ãããã¯ãé¤å¤ãããã¨ãã§ãã¾ãã
let a, x, y;
const r = 10;
{
const { PI, cos, sin } = Math;
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
IIFE ã使ç¨ã㦠with æãé¿ãã
é·ãååã®åç §ãä½åº¦ãåå©ç¨ããªããã°ãªããªãå¼ã使ããå ´åãå¼ã®ä¸ã§ãã®é·ãååãæé¤ãããã¨ãç®çã§ããã°ãå¼ã IIFE ã§å²ã¿ãé·ãååã弿°ã¨ãã¦æä¾ãããã¨ãã§ãã¾ãã
const objectHavingAnEspeciallyLengthyName = { foo: true, bar: false };
if (((o) => o.foo && !o.bar)(objectHavingAnEspeciallyLengthyName)) {
// This branch runs.
}
with æã¨ãããã·ã¼ã使ç¨ãã¦åçãªåå空éãçæ
with ã¯ãã¹ã¦ã®å¤æ°ã®æ¢ç´¢ãããããã£ã®æ¢ç´¢ã«å¤æããProxy ã§ã¯ãã¹ã¦ã®ããããã£ã®æ¢ç´¢ã®å¼ã³åºãããã©ãããããã¨ãã§ãã¾ããããããçµã¿åããããã¨ã§ãåçãªåå空éã使ãããã¨ãã§ãã¾ãã
const namespace = new Proxy(
{},
{
has(target, key) {
// `console` ã®ãããªã°ãã¼ãã«ããããã£ã¯ãã©ããããªã
if (key in globalThis) {
return false;
}
// ãã¹ã¦ã®ããããã£ã®åç
§ããã©ãã
return true;
},
get(target, key) {
return key;
},
},
);
with (namespace) {
console.log(a, b, c); // "a" "b" "c"
}
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-with-statement> |