ê°ë ì격íì§ ìì 기본ê°ì " ëì¨í 모ë(sloppy mode)"ë¼ê³ ë¶ë¥´ê¸°ë í©ëë¤. ê³µìì ì¸ ì©ì´ë ìëì§ë§ í¹ì 모르ë ììëì¸ì.
ECMAScript 5 ìì ìê°ë JavaScript ì ì격모ëë JavaScript ì ì íë ë²ì ì ì ííì¬ ì묵ì ì¸ "ëì¨í 모ë(sloppy mode)" 를 í´ì í기 ìí ë°©ë²ì ëë¤. ì격 모ëë ë¨ì§ ë¶ë¶ì ì¸ ê²ì´ ìëë©°, ì´ê²ì ê³ ìì ì¼ë¡ ì¼ë° ì½ëì ë¤ë¥¸ ìë©í±ì ê°ì§ê³ ììµëë¤. ì격모ë를 ì§ìíì§ ìë ë¸ë¼ì°ì ììë ì격 모ëì ì½ëê° ë¤ë¥¸ ë°©ìì¼ë¡ ëìí ê²ì ëë¤, ê·¸ ë문ì ì격 모ëê° ì ì íê² ì ì©ë í¼ì³ í ì¤í¸ ìì´ ì격 모ëì ìì¡´íë©´ ìë©ëë¤. ì격 모ëì ì½ëì ë¹-ì격 모ëì ì½ëë 공존í ì ìì¼ë©°, ë문ì ì¤í¬ë¦½í¸ì ì격 모ë를 ì·¨ì¬ ì ííë ê²ì´ ì ì§ì ì¼ë¡ ê°ë¥íê² ëììµëë¤.
ì격 모ëë íë²í JavaScript ìë©í±ì¤ì ëªê°ì§ ë³ê²½ì´ ì¼ì´ëê² í©ëë¤.
ì½ë를 JavaScriptì ë³íì´ ì íë íê²½ìì ëìíëë¡ íê³ ì¶ë¤ë©´, ì격 모ëë¡ì ë³í(transitioning to strict mode)ì ì°¸ê³ íì¸ì.
ì격모ë ì ì©í기ì격모ëë ì ì²´ ì¤í¬ë¦½í¸ ëë ë¶ë¶ í¨ìì ì ì©ê°ë¥í©ëë¤. ë¨, {}
ê´í¸ë¡ 묶ì¬ì§ ë¸ë문ìë ì ì©ëì§ ììµëë¤. 컨í
ì¤í¸ì ê°ìê³³ì ì ì©ì ìëíë©´ ëìíì§ ììµëë¤. eval
ì½ë, Function
ì½ë, ì´ë²¤í¸ í¸ë¤ë¬ ìì±, WindowTimers.setTimeout()
ê³¼ ì°ê´ë í¨ìë¤ì ì ë¬ë 문ìì´ì´ ì ì²´ ì¤í¬ë¦½í¸ì´ë©° ì¬ê¸°ìì ì격모ëê° ììëë¡ ëìí©ëë¤.
ì격모ë를 ì ì²´ ì¤í¬ë¦½í¸ì ì ì©í기 ìí´, ì íí 구문 "use strict";
(ëë 'use strict';
) ì ë¤ë¥¸ 구문 ìì± ì ì ì½ì
í©ëë¤.
// ì ì²´ ì¤í¬ë¦½í¸ ì격 모ë 구문
"use strict";
var v = "Hi! I'm a strict mode script!";
ì´ êµ¬ë¬¸ì ì´ë¯¸ ì ëª í ì¹ì¬ì´í¸ìì 문ì 를 ì¼ì¼í¨ ì ì ì´ ììµëë¤. ìì¶©ëì§ ìë ì¤í¬ë¦½í¸ë¤ ë¼ë¦¬ 맹목ì ì¸ ì°ê²°ì´ ë¶ê°ë¥í기 ë문ì ëë¤. ì격 모ëì ì¤í¬ë¦½í¸ì ë¹-ì격 모ëì ì¤í¬ë¦½í¸ì ì°ê²°ì ì¬ì¬ìê³ íì기를 ë°ëëë¤. ì´ë ê² ëë©´ ì ì²´ ì°ê²°ì ì격ì¼ë¡ ë³´ì ëë¤! ì격 모ëì ë¤ë¥¸ ì격모ë ë¤ì ê²°í©íë ê²ì ê´ì°®ìµëë¤. ê·¸ë¦¬ê³ , ë¹-ì격 ì¤í¬ë¦½í¸ ì¬ì´ì ê²°í©ë ê´ì°®ìµëë¤. ë¶ëª íê±´, ì¤í¬ë¦½í¸ë¥¼ ê²°í©íë ê²ì´ ì ë ì´ìì ì¸ ê²ì´ ìëë¼ë ê²ì´ì§ë§, ê·¸ëì¼ íë¤ë©´ í¨ì를 기ì¤ì¼ë¡ ì격모ë ì¬ì©ì ê³ ë ¤íì기 ë°ëëë¤.
ëí í¨ì ë´ë¶ì ì ì²´ ì¤í¬ë¦½í¸ ë´ì©ì ì ê·¼í ì ìì¼ë©°, ì격모ë를 ì¬ì©íë ì¸ë¶ í¨ì를 ê°ì§ ì ììµëë¤. ì´ë ê²°í© ë¬¸ì 를 ìì 주기ë íì§ë§, ì´ê²ì´ ì¤ì½í ë°ê¹¥ì ìì¹í ì´ë¤ ì ì ë³ìë íì¤íê² ë°ì¼ë¡ ì¶ì¶í ì ììì ì미í©ëë¤ .
í¨ìì strict mode ì ì©ë§ì°¬ê°ì§ë¡, í¨ìì strict mode를 ì ì©í기 ìí´, í¨ì 본문 ì²ìì ë¤ìì 구문ì ë£ìµëë¤. "use strict";
(ëë 'use strict';
).
function strict() {
// í¨ì-ë 벨 strict mode 문ë²
"use strict";
function nested() {
return "And so am I!";
}
return "Hi! I'm a strict mode function! " + nested();
}
function notStrict() {
return "I'm not strict.";
}
모ëì strict mode ì ì©
ECMAScript 2015 ë JavaScript 모ëì ìê°íìµëë¤. ë°ë¼ì, ì´ë ì격 모ë를 ì ì©í ì ìë 3ë² ì§¸ ë°©ë²ì ëë¤. JavaScript 모ëì ì ì²´ 컨í ì¸ ë ì격 모ë ììì ìí 구문 ìì´ë ìëì¼ë¡ ì격모ëì ëë¤.
function strict() {
// 모ëì´ê¸°ë문ì 기본ì ì¼ë¡ ì격í©ëë¤
}
export default strict;
ì격í 모ë ë³ê²½
ì격í 모ëë 구문과 ë°íì ëìì 모ë ë³ê²½í©ëë¤. ì¼ë°ì ì¼ë¡ ì´ë¬í ì íì ë³íê° ë°ìí©ëë¤: ë³í ì¤ì를 ì¤ë¥ë¡ í´ìíê±°ë(ë¬¸ë² ì¤ë¥ ëë ë°íìì ì¤ë¥ ë°ì), í¹ì ì´ë¦ì í¹ì ì©ëì ëí í¹ì ë³ì를 ê³ì°íë ë°©ë²ì ë¨ìííë©°, eval
ê³¼ arguments
를 ë¨ìííê³ ,"ìì í "ìë° ì¤í¬ë¦½í¸ë¥¼ ìì±íëë¡ ëê³ , 미ë ECMAScriptì ì§íì ëë¹í©ëë¤.
ì격í 모ëë ì¼ë¶ ì´ì ì íì©ëìë ì¤ì를 ì¤ë¥ë¡ ë°ê¿ ëìµëë¤. ìë° ì¤í¬ë¦½í¸ë ì´ë³´ ê°ë°ììê² ì¬ì´ ê²ì´ ëëë¡ ì¤ê³ëìì¼ë©°, ëë¡ë ì¤ë¥ë¥¼ ì¼ì¼í¬ë§í ëìì ìë¬ìì´ ìíí©ëë¤. ëëë¡ ì´ê²ì ì¦ê°ì ì¸ ë¬¸ì 를 í´ê²°íì§ë§, ëëë¡ ì´ê²ì ë ì¬ê°í 문ì 를 ë§ë¤ì´ ë ëë¤. ì격í 모ëë ì´ë¬í ì¤ì를 ì¤ë¥ë¡ ì²ë¦¬í´ì ê·¸ê²ì ë°ê²¬íê³ ì¦ì ê³ ì¹ ì ìëë¡ í©ëë¤.
첫째ë¡, ì격모ëë ì¤ìë¡ ê¸ë¡ë² ë³ì를 ìì±íë ê²ì ë¶ê°ë¥íê² ë§ëëë¤. ì¼ë°ì ì¸ JavaScriptìì ë³ì를 ì못 ì ë ¥íë©´ ì ì ê°ì²´ì ëí ì ìì±ì´ ë§ë¤ì´ì§ê³ ê·¸ëë¡ "ëì" (미ëì ì¤ë¥ê° ë°ìí ì ìì: modern ìë° ì¤í¬ë¦½í¸ì²ë¼) í©ëë¤. ì ì ë³ì를 ìì±íë í ë¹ì ì격 모ëìì ì¤ë¥ë¥¼ ë°ììíµëë¤.
"use strict";
// ì ì ë³ì mistypedVariable ì´ ì¡´ì¬íë¤ê³ ê°ì
mistypedVaraible = 17; // ë³ìì ì¤íë문ì ì´ ë¼ì¸ìì ReferenceError 를 ë°ììí´
ë째ë¡, ì격모ëë ìì¸ë¥¼ ë°ììí¤ë ì¤í¨ë¥¼ ì¡°ì©í ëì´ê°ë ëì ìì
ì ë§ëëë¤. ì를 ë¤ì´, NaN
ì ì¸ ì ìë ì ì ë³ìì
ëë¤. NaN
ì í ë¹íë ì¼ë°ì ì¸ ì½ëë ì무 ê²ë íì§ ììµëë¤. ê°ë°ìë ìë¬´ë° ì¤í¨ í¼ëë°±ì ë°ì§ ììµëë¤. ì격 모ëìì NaN
ì í ë¹íë ê²ì ìì¸ë¥¼ ë°ììíµëë¤. ì¼ë° ì½ëìì ì¡°ì©í ëì´ê°ë 모ë ì¤í¨ì ëí´ (ì¸ ì ìë ì ì ëë íë¡í¼í°ì í ë¹, getter-only íë¡í¼í°ì í ë¹, íì¥ ë¶ê° ê°ì²´ì ì íë¡í¼í° í ë¹) ì격 모ëììë ìì¸ë¥¼ ë°ììíµëë¤.
"use strict";
// ì¸ ì ìë íë¡í¼í°ì í ë¹
var undefined = 5; // TypeError ë°ì
var Infinity = 5; // TypeError ë°ì
// ì¸ ì ìë íë¡í¼í°ì í ë¹
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // TypeError ë°ì
// getter-only íë¡í¼í°ì í ë¹
var obj2 = {
get x() {
return 17;
},
};
obj2.x = 5; // TypeError ë°ì
// íì¥ ë¶ê° ê°ì²´ì ì íë¡í¼í° í ë¹
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // TypeError ë°ì
ì 째ë¡, ì격 모ëë ìì í ì ìë íë¡í¼í°ë¥¼ ìì íë ¤í ë ìì¸ë¥¼ ë°ììíµëë¤(ìëê° ì´ë¤ í¨ê³¼ë ìì ë).
"use strict";
delete Object.prototype; // TypeError ë°ì
ë·ì§¸ë¡, Gecko 34 ì´ì ì ì격모ëë ê°ì²´ 리í°ë´ì 모ë íë¡í¼í°ì ì´ë¦ì´ ì ëí¬í´ëë¡ ì구í©ëë¤. ì¼ë° ì½ëë íë¡í¼í°ì ê°ì´ ëì¤ì ì í´ì§ íë¡í¼í° ì´ë¦ì¼ë¡ ì¤ë³µí ê²ì ëë¤. íì§ë§ ë§ì§ë§ ì¸ì¤í´ì¤ ë§ ë³ê²½í기 ë문ì ì½ë를 ìì íì¬ ë§ì§ë§ ì¸ì¤í´ì¤ë¥¼ ë³ê²½íë ê² ì´ì¸ì ìì± ê°ì ë³ê²½íë©´ ë³µì ë ë²ê·¸ì 벡í°ê°ë©ëë¤. ì격모ëììë íë¡í¼í° ì´ë¦ì ì¤ë³µíë ê²ì 구문 ìë¬ì ëë¤.
ì°¸ê³ : ECMAScript 2015ë¶í°ë ìë¬ê° ìëëë¤. (Firefox bug 1041128).
"use strict";
var o = { p: 1, p: 2 }; // !!! 구문 ìë¬
ë¤ì¯ì§¸ë¡, ì격모ëë ì ëí¬í í¨ì íë¼ë¯¸í° ì´ë¦ì ì구í©ëë¤. ì¼ë° ì½ëììë ë§ì§ë§ì¼ë¡ ì¤ë³µë ì¸ìê° ì´ì ì ì§ì ë ì¸ì를 ì¨ê¹ëë¤. ì´ë¬í ì´ì ì ì¸ìë¤ì arguments[i]
를 íµí´ ì¬ì í ë¨ì ìì ì ìì¼ë¯ë¡, ìì í ì ê·¼ ë¶ê°í ê²ì´ ìëëë¤. ì¬ì í, ì´ë° ì¨ê¹ ì²ë¦¬ë ì´ì¹ì ë§ì§ ìì¼ë©° ìíë ê²ì´ ìë ì ììµëë¤(ì를 ë¤ë©´ ì¤í를 ì¨ê¸¸ ìë ììµëë¤). ë°ë¼ì ì격 모ëììë ì¤ë³µ ì¸ìëª
ì 구문 ìë¬ì
ëë¤.
function sum(a, a, c) {
// !!! 구문 ìë¬
"use strict";
return a + b + c; // ì½ëê° ì¤íëë©´ ì못ë ê²ì
}
ì¬ì¯ì§¸ë¡, ECMAScript 5 ììì ì격 모ëë 8ì§ êµ¬ë¬¸ì ê¸ì§í©ëë¤. 8ì§ êµ¬ë¬¸ì ES5ì 문ë²ì´ ìëì§ë§, 모ë ë¸ë¼ì°ì ìì ìì 0ì ë¶ì¬ ì§ìë©ëë¤(0644 === 420
ì "\045" === "%"
). ECMAScript 2015 ììë ì ëì¬ "0o
"를 ë¶ì¬ 8ì§ì를 ì§ìí©ëë¤.
var a = 0o10; // ES6: 8ì§ì
ì´ë³´ ê°ë°ìë¤ì ê°ë ìì ë¶ì 0 ì´ ë¬´ì미íë¤ê³ ìê°íì¬, ì´ë¥¼ ì ë ¬ì©ì¼ë¡ ì¬ì©í©ëë¤ â íì§ë§ ì´ë ì«ìì ì미를 ë°ê¿ë²ë¦½ëë¤! ì´ 8ì§ì 문ë²ì ê±°ì 무ì©íë©° ì못 ì¬ì©ë ì ìì¼ë¯ë¡ ì격모ëìì ì´ êµ¬ë¬¸ì ìë¬ì ëë¤.
"use strict";
var sum =
015 + // !!! 구문 ìë¬
197 +
142;
ì¼ê³±ì§¸ë¡, ECMAScript 6 ì ì격모ëë primitive ê°ì íë¡í¼í°ë¥¼ ì¤ì íë ê²ì ê¸ì§í©ëë¤. ì격모ëê° ìë ëìë íë¡í¼í° ì¤ì ì´ ê°ë¨íê² ë¬´ìëì§ë§(no-op), ì격모ëììë TypeError
를 ë°ììíµëë¤.
(function () {
"use strict";
false.true = ""; // TypeError
(14).sailing = "home"; // TypeError
"with".you = "far away"; // TypeError
})();
ë³ì ì¬ì© ë¨ìí
ì격모ëë ì½ëìì ë³ì ì´ë¦ì í¹ì ë³ì ì ìë¡ ë§¤ííë ë°©ë²ì ë¨ìíí©ëë¤. ë§ì ì»´íì¼ë¬ ìµì íë ë³ì X ê° ì´ë¤ ìì¹ì ì ì¥ëì´ ìëì§ë¥¼ ë§í´ì£¼ë ë¥ë ¥ì ìì¡´íê³ ììµëë¤. ì´ë JavaScript ì½ë를 ìì í ìµì ííëë° ì¤ìí©ëë¤. JavaScriptë ëëë¡ ì´ë¦ì ì½ëìì ë³ì ì ìë¡ ê¸°ë³¸ 매ííë ê²ì ë°íìëê¹ì§ ì¤íì´ ë¶ê°íê²í©ëë¤. ì격모ëë ì´ê²ì´ ë°ìíë ëë¶ë¶ì ê²½ì°ë¥¼ ì ê±°íì¬ ì»´íì¼ë¬ê° ì격모ë ì½ë를 ë ì ìµì í í ì ìê²í©ëë¤.
첫째ë¡, ì격모ëë with
를 ì¬ì©íì§ ëª»íê²í©ëë¤. with
ì¬ì©ì 문ì ë ë°íìì¤ì ë¸ë¡ìì 모ë ì´ë¦ì´ ì ë¬ë ê°ì²´ì íë¡í¼í°ë ì¸ê·¼ (ëë ì¬ì§ì´ ì ì) ì¤ì½í ë´ì ë³ìë¡ ë§¤íë ìë ìë¤ë ê²ì
ëë¤. ì´ë ì¬ì ì ìë ê²ì´ ë¶ê°í©ëë¤. ì격 모ëë with
를 구문 ìë¬ë¡ ë§ë¤ì´, with
ì ì´ë¦ì´ ë°íìì ì ì ìë ìì¹ë¥¼ 참조íì§ ìëë¡í©ëë¤.
"use strict";
var x = 17;
with (obj) {
// !!! 구문 ìë¬
// ì격모ëê° ìëë¼ë©´, ì´ë var x ê° ëì´ì¼ íëì,
// obj.x ê° ëì´ì¼ íëì?
// ì¼ë°ì ì¼ë¡ë ì½ë를 ì¤ííì§ ìê³ ì´ë¥¼ ë§íë ê²ì ë¶ê°íë¯ë¡,
// ì´ë¦ì ìµì í í ì ììµëë¤.
x;
}
ì´ë¦ì´ ì§§ì ë³ìì ê°ì²´ë¥¼ í ë¹í í, ë³ìì í´ë¹íë íë¡í¼í°ì ì ê·¼íë ê°ë¨í ëìì with
를 ëì²´í ì¤ë¹ê° ëììµëë¤.
ë째ë¡, ì격모ë ì½ëì eval
ì ìë¡ì´ ë³ì를 주ì ì¤ì½íì ì¶ê°íì§ ììµëë¤. ì¼ë°ì ì¸ ì½ëìì eval("var x;")
ë ë³ì x
를 주ì í¨ìë ì ì ì¤ì½íì ì¶ê°í©ëë¤. ì´ë, ì¼ë°ì ì¼ë¡ eval
í¸ì¶ì í¬í¨íë í¨ììì ì¸ìë ì§ì ë³ì를 참조íì§ ìë 모ë ì´ë¦ì ë°íìì í¹ì ì ìì ë°ëì 매íëì´ì¼ í¨ì ì미í©ëë¤(eval
ì´ ì¸ë¶ ë³ì를 ì¨ê¸°ë ìë¡ì´ ë³ì를 ì¶ê°í기 ë문ì
ëë¤). ì격모ëìì eval
ì evaluated ë ì½ëììë§ ë³ì를 ìì±íë¯ë¡, ì¸ë¶ ë³ìë ì¼ë¶ ë¡ì»¬ ë³ìì 참조íëì§ì ìí¥ì ì£¼ì§ ììµëë¤.
var x = 17;
var evalX = eval("'use strict'; var x = 42; x");
console.assert(x === 17);
console.assert(evalX === 42);
ì´ì ê´ë ¨í´ì, eval
í¨ìê° ì격모ë ì½ë ë´ìì eval(...)
ííì ííì¼ë¡ ì ì©ëìë¤ë©´, ì½ëë ì격모ë ì½ëë¡ evaluated ë©ëë¤. ì½ëë ëª
ìì ì¼ë¡ ì격모ë를 ì ì©í ì ìì§ë§, íìì ì¸ ê²ì ìëëë¤.
function strict1(str) {
"use strict";
return eval(str); // str ì ì격모ë ì½ëë¡ ë¤ë¤ì§
}
function strict2(f, str) {
"use strict";
return f(str); // eval(...) ì´ ìë:
// str ì ì격모ë를 ì ì©í ê²½ì°ìë§ ì격í¨
}
function nonstrict(str) {
return eval(str); // str ì ì격모ë를 ì ì©í ê²½ì°ìë§ ì격í¨
}
strict1("'ì격모ë ì½ë!'");
strict1("'use strict'; 'ì격모ë ì½ë!'");
strict2(eval, "'ëì¨í ì½ë.'");
strict2(eval, "'use strict'; 'ì격모ë ì½ë!'");
nonstrict("'ëì¨í ì½ë.'");
nonstrict("'use strict'; 'ì격모ë ì½ë!'");
ë°ë¼ì ì격모ë eval
ì½ë ë´ì ì´ë¦ì ì격모ë ì½ë ë´ì ì´ë¦ì´ eval
ì ê²°ê³¼ë¡ evaluated ëì§ ìì ê²ê³¼ ëì¼íê² ëìí©ëë¤.
ì
째ë¡, ì격모ëë ì¼ë° ì´ë¦ì ì ê±°íë ê²ì ê¸ì§í©ëë¤. ì격 모ëìì delete name
ì 구문 ìë¬ì
ëë¤.
"use strict";
var x;
delete x; // !!! 구문 ìë¬
eval("var y; delete y;"); // !!! syntax error
eval
ê³¼ arguments
를 ë ê°ë¨íê² í기
ì격모ëë arguments
ì eval
ì ë 기괴íê³ ë§ë²ì ì¼ë¡ ë§ëëë¤. ëì ì¼ë° ì½ëìì ìë¹í ë§ì ë§ë²ì ì¸ ëìë¤ì ê°ê³ ììµëë¤: ë°ì¸ë©ì ì¶ê°íê±°ë ìì íê³ ë°ì¸ë© ê°ì ë³ê²½í기ìí eval
, ëª
ëª
ë ì¸ì를 ì¨ë¦¬ì´ì¤íë ì¸ë±ì±ë íë¡í¼í° arguments
. ì격모ëë ECMAScript ì 미ë ë²ì ê¹ì§ë 모ë ìì ì´ ì´ë£¨ì§ì§ë ìê² ì§ë§ eval
ê³¼ arguments
를 í¤ìëë¡ ë¤ë£¨ê¸° ìí íë¥í í° ê±¸ìì ë´ëììµëë¤.
첫째ë¡, ë³ìëª eval ê³¼ arguments ë ì¸ì´ 문ë²ì ë°ì´ëëê±°ë í ë¹ë ì ììµëë¤. ë¤ì ìëë¤ì 모ë 구문 ìë¬ì ëë¤.
"use strict";
eval = 17;
arguments++;
++eval;
var obj = { set p(arguments) {} };
var eval;
try {
} catch (arguments) {}
function x(eval) {}
function arguments() {}
var y = function eval() {};
var f = new Function("arguments", "'use strict'; return 17;");
ë째ë¡, ì격모ë ì½ëë arguments
ê°ì²´ê° ìì±í íë¡í¼í°ë¥¼ ì¨ë¦¬ì´ì¤íì§ ììµëë¤. í¨ìì 첫 ë²ì§¸ ì¸ìê° arg
ì¸ ì¼ë° ì½ëììë arg
를 ì¤ì íë ê²ì arguments[0]
를 ì¤ì í기ë íë©°, ê·¸ ë°ëë ê·¸ë ìµëë¤(ì¸ìê° ì ê³µëì§ ìê±°ë, arguments[0]
ì´ ìì ë ê²½ì°ë ì ì¸). ì격모ë í¨ìì arguments
ê°ì²´ë í¨ìê° í¸ì¶ë ë ì본 ì¸ìë¤ì ì ì¥í©ëë¤. arguments[i]
ë ëª
ëª
ë ì¸ìì í´ë¹íë ê°ì ì¶ì íì§ ìì¼ë©°, ëª
ëª
ë ì¸ìë arguments[i]
ì í´ë¹íë ê°ì ì¶ì íì§ ììµëë¤.
function f(a) {
"use strict";
a = 42;
return [a, arguments[0]];
}
var pair = f(17);
console.assert(pair[0] === 42);
console.assert(pair[1] === 17);
ì
째ë¡, arguments.callee
ë ë ì´ì ì§ìëì§ ììµëë¤. ì¼ë° ì½ëì arguments.callee
ë ë°ê¹¥ í¨ì를 참조í©ëë¤. ì´ë° ì ì¦ ì¼ì´ì¤ë ì¤ìíì§ ììµëë¤. ê°ë¨í ë°ê¹¥ í¨ìì ì´ë¦ì ì¬ì©íë©´ë©ëë¤. ëì±ì´, arguments.callee
ë ì¸ë¼ì¸ í¨ìì ê°ì ìµì í를 ìë¹í ë°©í´íë¯ë¡, arguments.callee
ê° ì ê·¼íë í¨ìë ì¸ë¼ì¸ì´ ìë í¨ì를 참조íëë¡ ì ê³µí´ì¼ íìµëë¤. ì격모ë í¨ìì arguments.callee
ë ìì í ì ìë íë¡í¼í°ì´ë©°, ì¤ì ì´ë ë°íí ë ìë¬ë¥¼ ë°ìí©ëë¤.
"use strict";
var f = function () {
return arguments.callee;
};
f(); // TypeError
JavaScript "ë³´ì"
ì격모ëë "ë³´ìë" JavaScript를 ìì±í기 ì½ê² í´ì¤ëë¤. ì¼ë¶ ì¹ì¬ì´í¸ë¤ì ì¬ì©ìê° ë¤ë¥¸ ì¬ì©ìë¤ì ëì íì¬ ì¹ì¬ì´í¸ìì ì¤íìí¤ë JavaScript를 ìì±íë ë°©ë²ì ì ê³µí©ëë¤. ë¸ë¼ì°ì ìì JavaScriptë ì¬ì©ìì ê°ì¸ì ë³´ì ì ê·¼í ì ì기 ë문ì, JavaScriptë ê¸ì§ë 기ë¥ì ëí ê²ì´ì í기ìí´ ë°ëì ì¤íì ì ë¶ë¶ì ì¼ë¡ ë³ê²½ëì´ì¼ í©ëë¤. JavaScriptì ì ì°ì±ì¼ë¡ ì¸í´ ë§ì ë°íì ì²´í¬ìì´ ì´ê²ì ìííëê²ì ì¬ì¤ì ë¶ê°ë¥í©ëë¤. í¹ì ì¸ì´ì 기ë¥ë¤ì´ ë무 ê´ë²ìíì¬ ë°íì ê²ì¬ ìíì ìë¹í ì±ë¥ë¹ì©ì´ ìê¹ëë¤. ì격모ëì ìì ìì ê³¼ ì¬ì©ìê° ì ì¶í JavaScriptê° ì격모ëê° ëë©´ í¹ì ë°©ìì¼ë¡ í¸ì¶ëë¯ë¡ ë°íì ê²ì¬ì íìì±ì´ í¬ê² ì¤ì´ ëëë¤.
첫째, ì격모ëììë this
ë¡ í¨ìì ì ë¬ë ê°ì ê°ì ë¡ ê°ì²´ê° ëì§ ììµëë¤ (a.k.a. "boxed"). ë³´íµ í¨ìì ê²½ì°, this
ë ì¸ì ë ê°ì²´ì
ëë¤: ê°ì²´ê° this
ì í¨ê» í¸ì¶ë ê²½ì° ì ê³µë ê°ì²´ì´ê±°ë ; ë¶ì¸ê°, 문ì ëë ì«ì this
ë¡ í¸ì¶ë ê²½ì° ê·¸ ê°ì Boxed ì
ëë¤; ëë undefined
ëë null
this
ë¡ í¸ì¶ëë©´ ì ìê°ì²´ì
ëë¤. (í¹ì ë this
ëª
ì¸ë¥¼ ìí´ìë call
, apply
, ëë bind
를 ì¬ì©íììì) ìë ë°ì±ì ì±ë¥ ë¹ì©ë¿ ìëë¼ ì ì ê°ì²´ê° ë¸ë¼ì°ì ì ë
¸ì¶ëëê²ì ë³´ìì ìíí©ëë¤. ì ìê°ì²´ë¤ì JavaScript íê²½ì "ë³´ì" 기ë¥ì ì ê·¼íëê²ì ì ê³µí기ë문ì ì íëì´ì¼ í©ëë¤. ë°ë¼ì ì격모ëì í¨ìë, ì ìë this
ë ë°ì¤ë ê°ì²´ê° ëì§ ìì¼ë©°, ì ìëì§ ììê²½ì° this
ë undefined
ê° ë©ëë¤:
"use strict";
function fun() {
return this;
}
console.assert(fun() === undefined);
console.assert(fun.call(2) === 2);
console.assert(fun.apply(null) === null);
console.assert(fun.call(undefined) === undefined);
console.assert(fun.bind(true)() === true);
ì¦, ë¸ë¼ì°ì ìì ì격모ëì í¨ìë´ ììë ë ì´ì window
ê°ì²´ë¥¼ this
를 íµí´ 참조í ì ììµëë¤.
ë째ë¡, ì격모ëììë ECMAScriptì ì¼ë°ì ì¼ë¡ 구íë íì¥ì íµí´ JavaScript ì¤íì "ê±·ë"ê²ì´ ë¶ê°ë¥í©ëë¤. ì´ë¬í ì¼ë°ì ì¸ íì¥ ì½ëë, í¨ì fun
ì´ í¸ì¶ëë ì¤ê°ì, fun.caller
ë ê°ì¥ ìµê·¼ì fun
ì í¸ì¶í í¨ìì´ê³ fun.arguments
ë fun
ì í¸ì¶í기 ìí ì¸ìì
ëë¤. "ê¶íìë"í¨ìì (ì ì¬ì ì¼ë¡ ë³´ìëì§ ìì) ì¸ìì ì ê·¼ì íì©í기ë문ì ëê°ì§ íì¥ ëª¨ë JavaScriptì "ë³´ì" 문ì ê° ë©ëë¤. fun
ì´ ì격모ëì¸ê²½ì°, both fun.caller
ì fun.arguments
모ë ì¤ì ëë ê²ìë ë ìì ë¶ê°ë¥í ìì±ì´ ë©ëë¤.
function restricted() {
"use strict";
restricted.caller; // throws a TypeError
restricted.arguments; // throws a TypeError
}
function privilegedInvoker() {
return restricted();
}
privilegedInvoker();
ì
째, ì격모ëì ì¸ì
ë ëì´ì í´ë¹ í¨ìì í¸ì¶ ë³ìì ëí ì ê·¼ì ì ê³µíì§ ììµëë¤. ì¼ë¶ ì´ì ECMAScriptìì arguments.caller
í´ë¹ í¨ìì ë³ëª
ì´ ì§ì ë ê°ì²´ììµëë¤. ì´ê²ì í¨ìì ì¶ìí를 íµí´ ê¶íì´ ìë ê°ì ì¨ê¸¸ì ìë 기ë¥ì ì°¨ë¨íì¬ ë³´ìì ìíì´ ë©ëë¤; ì´ê²ì ëí ëë¶ë¶ì ìµì í를 ë°°ì ìíµëë¤. ì´ë¬í ì´ì ë¡ ìµì ë¸ë¼ì°ì ë¤ì ì´ë¥¼ 구ííì§ ììµëë¤. íì§ë§ ì´ê²ë¤ì ì´ì 기ë¥ë¤ ë문ì, ì격모ëí¨ììì arguments.caller
ì¤ì ì´ë ê²ìì ìì ë¶ê°ë¥í ììê° ë©ëë¤:
"use strict";
function fun(a, b) {
"use strict";
var v = 12;
return arguments.caller; //TypeError ê° ë°ì.
}
fun(1, 2); // doesn't expose v (or a or b)
미ëì ECMAScript ë²ì ì ìí ì¤ë¹
ìë¡ê² ì ë³´ì¼ ECMAScript ë²ì ì ìë¡ì´ 구문ì ìê°í ê²ì´ê³ , ECMAScript5ììì ì격 모ëë ë³íì ì½ê² í기 ìí´ ëª ê°ì§ì ì íì ì ì©í ê²ì¼ë¡ ììëê³ ììµëë¤. ë§ì½ ì´ ë³íë¤ì´ ì격 모ëììì ì íì 기ë°ì¼ë¡ íë¤ë©´, ë ë°ê¾¸ê¸° ì¬ìì§ ê²ì ëë¤.
첫ë²ì§¸ë¡, ì격 모ëììì ìë³ì íë³´ë¤ì ìì½ì´ê° ë©ëë¤. ì´ ìì½ì´ë¤ì implements
, interface
, let
, package
, private
, protected
, public
, static
, yield
ì
ëë¤. ê·¸ë¼, ì격 모ëììë ì´ ìì½ì´ì ëê°ì ì´ë¦ì ì¬ì©íê±°ë, ë³ìëª
ëë ìê·ë¨¼í¸ëª
ì¼ë¡ë ì¬ì©í ì ììµëë¤.
function package(protected) {
// !!!
"use strict";
var implements; // !!!
// !!!
interface: while (true) {
break interface; // !!!
}
function private() {} // !!!
}
function fun(static) {
"use strict";
} // !!!
Mozillaì í¹ë³ ì§ì ë ê°ì§ : 먼ì , ì½ëê° JavaScript 1.7 ëë ê·¸ë³´ë¤ ëê³ (ì를 ë¤ì´, í¬ë¡¬ ì½ë ëë <script type="">
를 ë°ë¡ ì¬ì©í ë) ì격 모ëì ì½ëë¼ë©´, let
ì yield
ë ì²ì ìê°ëìì ëì ê·¸ 기ë¥ì ê°ì§ë¤. ê·¸ë¬ë ì¹ììì ì격 모ë ì½ëë, <script src="">
ë <script>...</script>
ë¡ ë¡ë©ëì§, let
/yield
를 ìë³ìë¡ ì¬ì©í ìê° ìì ê²ì´ë¤. ê·¸ë¦¬ê³ ëìë, ES5 ê° class
, enum
, export
, extends
, import
, and super
ì ê°ì ìì½ì´ë¤ì 무조건 리ì ë¸í¨ìë ë¶êµ¬íê³ , 먼ì Firefox 5 Mozilla ë ê·¸ê²ë¤ì ì격 모ëììë§ ë¦¬ì ë¸íë¤.
ë¤ìì, ì격 모ëë ì¤í¬ë¦½í¸ë í¨ìì í ë ë²¨ì´ ìë ê³³ììì í¨ì ë´ì© ì ì를 ì íí©ëë¤. (strict mode prohibits function statements not at the top level of a script or function). ë¸ë¼ì°ì ìì ì¼ë°ì ì¸ ì½ëë í¨ì ë´ì© ì ìê° "ì´ëììë " íì©ë©ëë¤. ì´ê²ì ES5ì ë¶ë¶ì´ ìëëë¤!(ì¬ì§ì´ ES3ë ìëë¤.) ì´ê±´ ë¤ë¥¸ ë¸ë¼ì°ì ìì 공존í ì ìë ìë©í±ì íì¥ì ëë¤. ìì¼ë¡ì ECMAScript ìëì ì ë°ë¼ê±´ë, ì¤í¬ë¦½í¸ë í¨ìì í ë ë²¨ì´ ìë ê³³ììì í¨ì ë´ì© ì ì를 ìí´, ìë¡ì´ ìë©í±ì ëª ìí ê²ì ëë¤. ì격 모ëìì ì´ë¬í í¨ì ì ì를 ê¸ì§íë ê²(Prohibiting such function statements in strict mode)ì ìì¼ë¡ ì¶ìë ECMAScriptì ì¬ìì ìí "ì¤ë¹"ì ëë¤. :
"use strict";
if (true) {
function f() {} // !!! syntax error
f();
}
for (var i = 0; i < 5; i++) {
function f2() {} // !!! syntax error
f2();
}
function baz() {
// kosher
function eit() {} // also kosher
}
ì´ ê·ì ë ìë°í ë§íë©´ ì격 모ëê° ìëë°, ì ë° í¨ì ííìë¤ì 기본 ECMAScript5ì íì¥ì´ê¸° ë문ì ëë¤. ê·¸ë¬ë ì´ê²ì´ ECMAScript ííê° ê¶ì¥íë ë°©ìì´ë©°, ë¸ë¼ì°ì ë¤ì´ ì´ë¥¼ ì§ìí ê²ì ëë¤.
ë¸ë¼ì°ì ììì ì격 모ëíì¬ ì£¼ë¥ì ë¸ë¼ì°ì ë¤ì ì격 모ë를 ì§ìíê³ ììµëë¤. íì§ë§, ìì§ë íì¤ìì ì¬ì©ëë ì ë§ì ë¸ë¼ì°ì ì ë²ì ë¤ì ì격 모ë를 ë¶ë¶ì ì¼ë¡ë§ ì§ìíê±°ë(Browser versions used in the wild that only have partial support for strict mode), ìì ì§ìì íì§ ìê³ ì기 ë문ì, 맹목ì ì¼ë¡ ì¬ê¸°ì ìì§í ìë ììµëë¤. (ì를 ë¤ë©´, Internet Explorer 10 ë²ì ì´í!) ì격 모ëë ìë©í±ì ë°ê¿ëë¤. ì´ ë³íë¤ì ìì§íë ê²ì ì¤ìì ì격 모ë를 ì§ìíì§ ìë ë¸ë¼ì°ì ì ìë¬ë¥¼ ì¼ê¸°í ê²ì ëë¤. ì격 모ë를 ì¬ì©íë ë°ì 주ìíë ê²ì ìµíì¸ì, ê·¸ë¦¬ê³ í¼ì³ í ì¤í¸ë¡ ì격 모ë를 ì¬ì©í기ì ì ì í ë¶ë¶ì¸ì§ íì¸íê³ ë³´ìíì¸ì. ë§ì§ë§ì¼ë¡, ì격 모ë를 ì§ìíë ë¸ë¼ì°ì ì ê·¸ë ì§ ìì ë¸ë¼ì°ì ìì ìì±í ì½ëì í ì¤í¸ë¥¼ íì¤í íëë¡ íì¸ì.
ëª ì¸ì í¨ê» 보기RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4