夿³¨ï¼ ææ¶ä½ ä¼çå°éä¸¥æ ¼æ¨¡å¼ï¼è¢«ç§°ä¸ºâsloppy modeâãè¿ä¸æ¯ä¸ä¸ªå®æ¹æ¯è¯ï¼ä½ä»¥é²ä¸ä¸ï¼ä½ åºè¯¥æè¯å°è¿ä¸ç¹ã
ECMAScript 5çä¸¥æ ¼æ¨¡å¼æ¯éç¨å ·æéå¶æ§ JavaScript åä½çä¸ç§æ¹å¼ï¼ä»è使代ç éå¼å°è±ç¦»âé©¬èæ¨¡å¼/ç¨æ¾æ¨¡å¼/ææ£æ¨¡å¼âï¼sloppyï¼æ¨¡å¼ãä¸¥æ ¼æ¨¡å¼ä¸ä» ä» æ¯ä¸ä¸ªåéï¼å®çäº§çæ¯ä¸ºäºå½¢æä¸æ£å¸¸ä»£ç ä¸åçè¯ä¹ã䏿¯æä¸¥æ ¼æ¨¡å¼ä¸æ¯æä¸¥æ ¼æ¨¡å¼çæµè§å¨å¨æ§è¡ä¸¥æ ¼æ¨¡å¼ä»£ç æ¶ä¼éç¨ä¸åè¡ä¸ºãæä»¥å¨æ²¡æå¯¹è¿è¡ç¯å¢å±å¼ç¹æ§æµè¯æ¥éªè¯å¯¹äºä¸¥æ ¼æ¨¡å¼ç¸å ³æ¹é¢æ¯æçæ åµä¸ï¼å°±ç®éç¨äºä¸¥æ ¼æ¨¡å¼ä¹ä¸ä¸å®ä¼åå¾é¢æææãä¸¥æ ¼æ¨¡å¼ä»£ç åéä¸¥æ ¼æ¨¡å¼ä»£ç å¯ä»¥å ±åï¼å æ¤é¡¹ç®èæ¬å¯ä»¥æ¸è¿å¼å°éç¨ä¸¥æ ¼æ¨¡å¼ãä¸¥æ ¼æ¨¡å¼å¯¹æ£å¸¸ç JavaScript è¯ä¹åäºä¸äºæ´æ¹ã
å¦æä½ æ³æ¹åä½ ç代ç ï¼è®©å ¶å·¥ä½å¨å ·æéå¶æ§ JavaScript ç¯å¢ä¸ï¼è¯·åé è½¬æ¢æä¸¥æ ¼æ¨¡å¼ã
è°ç¨ä¸¥æ ¼æ¨¡å¼ä¸¥æ ¼æ¨¡å¼å¯ä»¥åºç¨å°æ´ä¸ªèæ¬æä¸ªå«å½æ°ä¸ãä¸è¦å¨å°é大æ¬å¼§ {}
å
è¿æ ·åï¼å¨è¿æ ·çä¸ä¸æä¸è¿ä¹åæ¯æ²¡æææçãå¨ eval
ãFunction
ãäºä»¶å¤çå¨å±æ§ãsetTimeout()
æ¹æ³ä¸ä¼ å
¥çèæ¬å符串ï¼å
¶è¡ä¸ºç±»ä¼¼äºå¼å¯äºä¸¥æ ¼æ¨¡å¼çä¸ä¸ªåç¬èæ¬ï¼å®ä»¬ä¼å¦é¢æä¸æ ·å·¥ä½ã
为æ´ä¸ªèæ¬æä»¶å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼éè¦å¨ææè¯å¥ä¹åæ¾ä¸ä¸ªç¹å®è¯å¥ "use strict";
ï¼æ 'use strict';
ï¼ã
// æ´ä¸ªèæ¬é½å¼å¯ä¸¥æ ¼æ¨¡å¼çè¯æ³
"use strict";
const v = "ä½ å¥½ï¼ææ¯ä¸ä¸ªä¸¥æ ¼æ¨¡å¼çèæ¬ï¼";
ä¸ºå½æ°å¼å¯ä¸¥æ ¼æ¨¡å¼
åæ ·å°ï¼è¦ç»æä¸ªå½æ°å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼å¾æç¹å®è¯å¥ "use strict";
ï¼æ 'use strict';
ï¼æ¾å¨å½æ°ä½ææè¯å¥ä¹åã
function myStrictFunction() {
// 彿°çº§å«ä¸¥æ ¼æ¨¡å¼è¯æ³
"use strict";
function nested() {
return "æä¹ä¸æ ·ï¼";
}
return `ä½ å¥½ï¼ææ¯ä¸¥æ ¼æ¨¡å¼ç彿°ï¼${nested()}`;
}
function myNotStrictFunction() {
return "æä¸æ¯ä¸¥æ ¼æ¨¡å¼ç彿°ã";
}
ä¸¥æ ¼æ¨¡å¼ä¸çåå
ä¸¥æ ¼æ¨¡å¼åæ¶æ¹åäºè¯æ³åè¿è¡æ¶è¡ä¸ºãååé常å为è¿å ç±»ï¼å°é®é¢ç´æ¥è½¬å为é误ï¼å¦è¯æ³é误æè¿è¡æ¶é误ï¼ï¼ç®åäºå¦ä½ä¸ºç»å®åç§°çç¹å®åé计ç®ï¼ç®åäº eval
以å arguments
ï¼å°åâå®å
¨âJavaScript çæ¥éª¤å徿´ç®åï¼ä»¥åæ¹åäºé¢æµæªæ¥ ECMAScript è¡ä¸ºçæ¹å¼ã
å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼æäºå å被æ¥åçè¿å¤±é误å°ä¼è¢«è®¤ä¸ºæ¯å¼å¸¸ãJavaScript 被设计为è½ä½¿æ°äººå¼åè æ´æäºä¸æï¼æä»¥ææ¶åä¼ç»æ¬æ¥é误æä½èµäºæ°ç䏿¥é误çè¯ä¹ï¼non-error semanticsï¼ãææ¶åè¿å¯ä»¥è§£å³å½åçé®é¢ï¼ä½ææ¶åå´ä¼ç»ä»¥åç䏿´å¤§çé®é¢ãä¸¥æ ¼æ¨¡å¼åæè¿äºå¤±è¯¯å½æé误ï¼ä»¥ä¾¿å¯ä»¥åç°å¹¶ç«å³å°å ¶æ¹æ£ã
ç»æªå£°æçåéèµå¼ä¸¥æ ¼æ¨¡å¼ä¸æ æ³åæå¤åå»ºå ¨å±åéãå¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼å¨èµå¼ä¸é误æ¼åçåéä¼å¨å ¨å±å¯¹è±¡ä¸å建ä¸ä¸ªæ°å±æ§å¹¶ç»§ç»âå·¥ä½âãå¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼æå¤åå»ºå ¨å±åéçèµå¼ä¼æåºé误ï¼
"use strict";
let mistypeVariable;
// å设å
¨å±åé mistypeVarible ä¸åå¨ï¼ç±äºâmistypeVariableâæ¼åé误ï¼ç¼ºå°âaâï¼ï¼è¿è¡ä¼æåº ReferenceError
mistypeVarible = 17;
ç»å¯¹è±¡å±æ§èµå¼ä¼å¤±è´¥
第äºï¼ä¸¥æ ¼æ¨¡å¼ä¼ä½¿å¼èµ·éé»å¤±è´¥ï¼silently failï¼æ³¨ï¼ä¸æ¥é乿²¡æä»»ä½ææï¼çèµå¼æä½æåºå¼å¸¸ãä¾å¦ï¼NaN
æ¯ä¸ä¸ªä¸å¯åçå
¨å±åéã卿£å¸¸æ¨¡å¼ä¸ï¼ç» NaN
èµå¼ä¸ä¼äº§çä»»ä½ä½ç¨; å¼åè
ä¹ä¸ä¼åå°ä»»ä½é误åé¦ãä½å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼ç» NaN
èµå¼ä¼æåºä¸ä¸ªå¼å¸¸ãä»»ä½å¨æ£å¸¸æ¨¡å¼ä¸å¼èµ·éé»å¤±è´¥çèµå¼æä½ï¼ç»ä¸å¯å屿§èµå¼ï¼ç»åªè¯»å±æ§ï¼getter-onlyï¼èµå¼ï¼ç»ä¸å¯æ©å±å¯¹è±¡çæ°å±æ§èµå¼ï¼é½ä¼æåºå¼å¸¸ï¼
"use strict";
// ç»ä¸å¯åå
¨å±åéèµå¼
undefined = 5; // TypeError
Infinity = 5; // TypeError
// ç»ä¸å¯å屿§èµå¼
const obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // TypeError
// ç»åªè¯»å±æ§èµå¼
const obj2 = {
get x() {
return 17;
},
};
obj2.x = 5; // TypeError
// ç»ä¸å¯æ©å±å¯¹è±¡çæ°å±æ§èµå¼
const fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // TypeError
第ä¸ï¼å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼è¯å¾å é¤ä¸å¯å é¤ç屿§æ¶ä¼æåºå¼å¸¸ï¼ä¹åè¿ç§æä½ä¸ä¼äº§ç任使æï¼ï¼
"use strict";
delete Object.prototype; // æåº TypeError é误
第åï¼å¨ Gecko çæ¬ 34 ä¹åï¼ä¸¥æ ¼æ¨¡å¼è¦æ±ä¸ä¸ªå¯¹è±¡å çææå±æ§åå¨å¯¹è±¡å å¿ é¡»å¯ä¸ãæ£å¸¸æ¨¡å¼ä¸éå屿§æ¯å 许çï¼æåä¸ä¸ªéåç屿§å³å®å ¶å±æ§å¼ãå ä¸ºåªææåä¸ä¸ªå±æ§èµ·ä½ç¨ï¼å½ä»£ç è¦å»æ¹å屿§å¼è䏿¯ä¿®æ¹æåä¸ä¸ªéå屿§çæ¶åï¼å¤å¶è¿ä¸ªå¯¹è±¡å°±äº§çä¸è¿ä¸²ç bugãå¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼éå屿§è¢«è®¤ä¸ºæ¯è¯æ³é误ï¼
夿³¨ï¼ è¿ä¸ªé®é¢å¨ ECMAScript6 ä¸å·²ç»ä¸å¤åå¨ï¼Firefox bug 1041128ï¼ã
"use strict";
var o = { p: 1, p: 2 }; // !!! è¯æ³é误
第äºï¼ä¸¥æ ¼æ¨¡å¼è¦æ±å½æ°çåæ°åå¯ä¸ã卿£å¸¸æ¨¡å¼ä¸ï¼æåä¸ä¸ªéååæ°å伿©çä¹åçéååæ°ãä¹åçåæ°ä»ç¶å¯ä»¥éè¿ arguments[i]
æ¥è®¿é®ï¼è¿ä¸æ¯å®å
¨æ æ³è®¿é®ãç¶èï¼è¿ç§éèæ¯«æ æä¹èä¸å¯è½æ¯ææä¹å¤çï¼æ¯å¦å®å¯è½æ¬æ¥æ¯æéäºï¼ï¼æä»¥å¨ä¸¥æ ¼æ¨¡å¼ä¸éååæ°è¢«è®¤ä¸ºæ¯è¯æ³é误ï¼
function sum(a, a, c) {
// !!! è¯æ³é误
"use strict";
return a + a + c; // 代ç è¿è¡å°è¿éä¼åºé
}
第å
ï¼ä¸¥æ ¼æ¨¡å¼ç¦æ¢å
«è¿å¶æ°åè¯æ³ãECMAScript å¹¶ä¸å
å«å
«è¿å¶è¯æ³ï¼ä½ææçæµè§å¨é½æ¯æè¿ç§ä»¥é¶ï¼0
ï¼å¼å¤´çå
«è¿å¶è¯æ³ï¼0644 === 420
è¿æ "\045" === "%"
ãå¨ ECMAScript 6 䏿¯æä¸ºä¸ä¸ªæ°åå 0o
çåç¼æ¥è¡¨ç¤ºå
«è¿å¶æ°ã
var a = 0o10; // ES6: å
«è¿å¶
æäºæ°æå¼åè 认为æ°åçå坼鶿²¡æè¯æ³æä¹ï¼æä»¥ä»ä»¬ä¼ç¨ä½å¯¹é½æªæ½ â ä½å ¶å®è¿ä¼æ¹åæ°åçæä¹ï¼å «è¿å¶è¯æ³å¾å°æç¨å¹¶ä¸å¯è½ä¼é误使ç¨ï¼æä»¥ä¸¥æ ¼æ¨¡å¼ä¸å «è¿å¶è¯æ³ä¼å¼èµ·è¯æ³é误ï¼
"use strict";
var sum =
015 + // !!! è¯æ³é误
197 +
142;
第ä¸ï¼ä¸¥æ ¼æ¨¡å¼ç¦æ¢è®¾ç½®åå§å¼ç屿§ãä¸éç¨ä¸¥æ ¼æ¨¡å¼ï¼è®¾ç½®å±æ§å°ä¼ç®å忽ç¥ï¼no-opï¼ï¼éç¨ä¸¥æ ¼æ¨¡å¼ï¼å°æåº TypeError
é误
"use strict";
false.true = ""; // TypeError
(14).sailing = "home"; // TypeError
"with".you = "far away"; // TypeError
ç®ååéç使ç¨
ä¸¥æ ¼æ¨¡å¼ç®åäºä»£ç ä¸åéååæ å°å°åéå®ä¹çæ¹å¼ãå¾å¤ç¼è¯å¨çä¼åæ¯ä¾èµåå¨åé X ä½ç½®çè½åï¼è¿å¯¹å ¨é¢ä¼å JavaScript 代ç è³å ³éè¦ãJavaScript æäºæ åµä¼ä½¿å¾ä»£ç ä¸ååå°åéå®ä¹çåºæ¬æ å°åªå¨è¿è¡æ¶æäº§çãä¸¥æ ¼æ¨¡å¼ç§»é¤äºå¤§å¤æ°è¿ç§æ åµçåçï¼æä»¥ç¼è¯å¨å¯ä»¥æ´å¥½çä¼åä¸¥æ ¼æ¨¡å¼ç代ç ã
第ä¸ï¼ä¸¥æ ¼æ¨¡å¼ç¦ç¨ with
ãwith
æå¼èµ·çé®é¢æ¯åå
çä»»ä½åç§°å¯ä»¥æ å°ï¼mapï¼å° with ä¼ è¿æ¥ç对象ç屿§ï¼ä¹å¯ä»¥æ å°å°å
å´è¿ä¸ªåçä½ç¨åå
çåéï¼çè³æ¯å
¨å±åéï¼ï¼è¿ä¸å齿¯å¨è¿è¡æ¶å³å®çï¼å¨ä»£ç è¿è¡ä¹åæ¯æ æ³å¾ç¥çãä¸¥æ ¼æ¨¡å¼ä¸ï¼ä½¿ç¨ with
ä¼å¼èµ·è¯æ³éè¯¯ï¼æä»¥å°±ä¸ä¼åå¨ with åå
çåéå¨è¿è¡æ¶æå³å®å¼ç¨å°åªéçæ
åµäºï¼
"use strict";
var x = 17;
with (obj) {
// !!! è¯æ³é误
// å¦ææ²¡æå¼å¯ä¸¥æ ¼æ¨¡å¼ï¼with ä¸çè¿ä¸ª x 伿å with ä¸é¢çé£ä¸ª xï¼è¿æ¯ obj.xï¼
// 妿ä¸è¿è¡ä»£ç ï¼æä»¬æ æ³ç¥éï¼å æ¤ï¼è¿ç§ä»£ç è®©å¼ææ æ³è¿è¡ä¼åï¼é度ä¹å°±ä¼åæ
¢ã
x;
}
ä¸ç§å代 with
çç®åæ¹æ³æ¯ï¼å°ç®æ 对象èµç»ä¸ä¸ªçå½ååéï¼ç¶å访é®è¿ä¸ªåéä¸çç¸åºå±æ§ã
第äºï¼ä¸¥æ ¼æ¨¡å¼ä¸ eval
ä¸å为å¨å´çä½ç¨åå¼å
¥æ°åéã卿£å¸¸æ¨¡å¼ä¸ï¼ä»£ç eval("var x;")
ä¼ç»ä¸å±å½æ°ï¼surrounding functionï¼æè
å
¨å±å¼å
¥ä¸ä¸ªæ°çåé x
ãè¿æå³çï¼ä¸è¬æ
åµä¸ï¼å¨ä¸ä¸ªå
å« eval
è°ç¨ç彿°å
æææ²¡æå¼ç¨å°åæ°æè
å±é¨åéçåç§°é½å¿
é¡»å¨è¿è¡æ¶æè½è¢«æ å°å°ç¹å®çå®ä¹ï¼å 为 eval
å¯è½å¼å
¥çæ°åéä¼è¦çå®çå¤å±åéï¼ãå¨ä¸¥æ ¼æ¨¡å¼ä¸ eval
ä»
ä»
为被è¿è¡ç代ç å建åéï¼æä»¥ eval
ä¸ä¼ä½¿å¾åç§°æ å°å°å¤é¨åéæè
å
¶ä»å±é¨åéï¼
var x = 17;
var evalX = eval("'use strict'; var x = 42; x");
console.assert(x === 17);
console.assert(evalX === 42);
ç¸åºå°ï¼å¦æå½æ° eval
被å¨ä¸¥æ ¼æ¨¡å¼ä¸çeval(...)
以表达å¼çå½¢å¼è°ç¨æ¶ï¼å
¶ä»£ç ä¼è¢«å½åä¸¥æ ¼æ¨¡å¼ä¸çä»£ç æ§è¡ãå½ç¶ä¹å¯ä»¥å¨ä»£ç 䏿¾å¼å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä½è¿æ ·å并䏿¯å¿
é¡»çã
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 ä¸ç代ç å¼å¯äº"use strict"ï¼str ä¸çä»£ç æä¼å¨ä¸¥æ ¼æ¨¡å¼ä¸è¿è¡
}
strict1("'Strict mode code!'");
strict1("'use strict'; 'Strict mode code!'");
strict2(eval, "'Non-strict code.'");
strict2(eval, "'use strict'; 'Strict mode code!'");
nonstrict("'Non-strict code.'");
nonstrict("'use strict'; 'Strict mode code!'");
å æ¤ï¼å¨ eval æ§è¡çä¸¥æ ¼æ¨¡å¼ä»£ç ä¸ï¼åéçè¡ä¸ºä¸ä¸¥æ ¼æ¨¡å¼ä¸é eval æ§è¡ç代ç ä¸çåéç¸åã
第ä¸ï¼ä¸¥æ ¼æ¨¡å¼ç¦æ¢å é¤å£°æåéãdelete name
å¨ä¸¥æ ¼æ¨¡å¼ä¸ä¼å¼èµ·è¯æ³é误ï¼
"use strict";
var x;
delete x; // !!! è¯æ³é误
eval("var y; delete y;"); // !!! è¯æ³é误
让 eval å arguments åçç®å
ä¸¥æ ¼æ¨¡å¼è®© arguments
å eval
å°äºä¸äºå¥æªçè¡ä¸ºã两è
å¨é常ç代ç ä¸é½å
å«äºå¾å¤å¥æªçè¡ä¸ºï¼eval
伿·»å å é¤ç»å®ï¼æ¹åç»å®å¥½çå¼ï¼è¿ä¼éè¿ç¨å®ç´¢å¼è¿ç屿§ç»å½¢ååå«åçæ¹å¼ä¿®æ¹å½¢åãè½ç¶å¨æªæ¥ç 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(); // æåºç±»åé误
"å®å
¨ç" JavaScript
ä¸¥æ ¼æ¨¡å¼ä¸æ´å®¹æååºâå®å ¨âç JavaScriptãç°å¨æäºç½ç«æä¾äºæ¹å¼ç»ç¨æ·ç¼åè½å¤è¢«ç½ç«å ¶ä»ç¨æ·æ§è¡ç JavaScript 代ç ã卿µè§å¨ç¯å¢ä¸ï¼JavaScript è½å¤è·åç¨æ·çéç§ä¿¡æ¯ï¼å æ¤è¿ç±» Javascript å¿ é¡»å¨è¿è¡åé¨åè¢«è½¬æ¢æéè¦ç³è¯·è®¿é®ç¦ç¨åè½çæéãæ²¡æå¾å¤çæ§è¡æ¶æ£æ¥çæ åµï¼Javascript ççµæ´»æ§è®©å®æ æ³ææçå°åè¿ä»¶äºãä¸äºè¯è¨ä¸ç彿°æ®éåºç°ï¼ä»¥è³äºæ§è¡æ¶æ£æ¥ä»ä»¬ä¼å¼èµ·ä¸¥éçæ§è½æèãåä¸äºå¨ä¸¥æ ¼æ¨¡å¼ä¸åççå°æ¹å¨ï¼è¦æ±ç¨æ·æäº¤ç JavaScript å¼å¯ä¸¥æ ¼æ¨¡å¼å¹¶ä¸ç¨ç¹å®çæ¹å¼è°ç¨ï¼å°±ä¼å¤§å¤§åå°å¨æ§è¡æ¶è¿è¡æ£æ¥çå¿ è¦ã
第ä¸ï¼å¨ä¸¥æ ¼æ¨¡å¼ä¸éè¿ this
ä¼ éç»ä¸ä¸ªå½æ°çå¼ä¸ä¼è¢«å¼ºå¶è½¬æ¢ä¸ºä¸ä¸ªå¯¹è±¡ã对ä¸ä¸ªæ®éç彿°æ¥è¯´ï¼this
æ»ä¼æ¯ä¸ä¸ªå¯¹è±¡ï¼ä¸ç®¡è°ç¨æ¶ this
宿¬æ¥å°±æ¯ä¸ä¸ªå¯¹è±¡ï¼è¿æ¯ç¨å¸å°å¼ï¼å符串æè
æ°åè°ç¨å½æ°æ¶å½æ°éé¢è¢«å°è£
æå¯¹è±¡ç this
ï¼è¿æ¯ä½¿ç¨ undefined
æè
null
è°ç¨å½æ°å¼ this
代表çå
¨å±å¯¹è±¡ï¼ä½¿ç¨ call
ãapply
æ bind
æ¹æ³æ¥æå®ä¸ä¸ªç¡®å®ç this
ï¼ãè¿ç§èªå¨è½¬å为对象çè¿ç¨ä¸ä»
æ¯ä¸ç§æ§è½ä¸çæèï¼åæ¶å¨æµè§å¨ä¸æ´é²åºå
¨å±å¯¹è±¡ä¹ä¼æä¸ºå®å
¨éæ£ï¼å 为å
¨å±å¯¹è±¡æä¾äºè®¿é®é£äºæè°å®å
¨ç 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);
第äºï¼å¨ä¸¥æ ¼æ¨¡å¼ä¸åä¹ä¸è½éè¿å¹¿æ³å®ç°ç ECMAScript æ©å±â游走äºâJavaScript çæ ä¸ã卿®é模å¼ä¸ç¨è¿äºæ©å±çè¯ï¼å½ä¸ä¸ªå«fun
ç彿°æ£å¨è¢«è°ç¨çæ¶åï¼fun.caller
æ¯æåä¸ä¸ªè°ç¨fun
ç彿°ï¼èä¸fun.arguments
å
å«è°ç¨fun
æ¶ç¨çå½¢åãè¿ä¸¤ä¸ªæ©å±æ¥å£å¯¹äºâå®å
¨âJavaScript èè¨é½æ¯æé®é¢çï¼å 为ä»ä»¬å
许âå®å
¨çâ代ç 访é®"䏿"彿°åä»ä»¬çï¼éå¸¸æ¯æ²¡æç»è¿ä¿æ¤çï¼å½¢åã妿fun
å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼é£ä¹fun.caller
åfun.arguments
齿¯ä¸å¯å é¤ç屿§èä¸å¨åå¼ãå弿¶é½ä¼æ¥éï¼
function restricted() {
"use strict";
restricted.caller; // æåºç±»åé误
restricted.arguments; // æåºç±»åé误
}
function privilegedInvoker() {
return restricted();
}
privilegedInvoker();
第ä¸ï¼ä¸¥æ ¼æ¨¡å¼ä¸çarguments
ä¸ä¼åæä¾è®¿é®ä¸è°ç¨è¿ä¸ªå½æ°ç¸å
³çåéçéå¾ãå¨ä¸äºæ§æ¶ç ECMAScript å®ç°ä¸arguments.caller
æ¾ç»æ¯ä¸ä¸ªå¯¹è±¡ï¼éé¢åå¨ç屿§æåé£ä¸ªå½æ°çåéãè¿æ¯ä¸ä¸ªå®å
¨éæ£ï¼å 为å®éè¿å½æ°æ½è±¡æç ´äºæ¬æ¥è¢«éèèµ·æ¥çä¿çå¼ï¼å®åæ¶ä¹æ¯å¼èµ·å¤§éä¼åå·¥ä½çåå ãåºäºè¿äºåå ï¼ç°å¨çæµè§å¨æ²¡æå®ç°å®ã使¯å 为å®è¿ç§åå²éççåè½ï¼arguments.caller
å¨ä¸¥æ ¼æ¨¡å¼ä¸åæ ·æ¯ä¸ä¸ªä¸å¯è¢«å é¤ç屿§ï¼å¨èµå¼æè
å弿¶ä¼æ¥éï¼
"use strict";
function fun(a, b) {
"use strict";
var v = 12;
return arguments.caller; // æåºç±»åé误
}
fun(1, 2); // ä¸ä¼æ´é² vï¼æè
aï¼æè
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 å以ä¸ï¼ä½ ç chrome ä»£ç æè
ä½ æ£ç¡®ä½¿ç¨äº<script type="">
ï¼å¹¶ä¸å¼å¯äºä¸¥æ ¼æ¨¡å¼çè¯ï¼å 为let
åyield
æ¯æå
å¼å
¥çå
³é®åï¼æä»¥å®ä»¬ä¼èµ·ä½ç¨ã使¯ç½ç»ä¸ç¨<script src="">
æè
<script>...</script>
å è½½ç代ç ï¼let
æè
yield
é½ä¸ä¼ä½ä¸ºå
³é®åèµ·ä½ç¨ï¼ç¬¬äºï¼å°½ç®¡ ES5 æ æ¡ä»¶çä¿çäºclass
ãenum
ãexport
ãextends
ãimport
åsuper
å
³é®åï¼å¨ Firefox 5 ä¹åï¼Mozilla ä»
ä»
å¨ä¸¥æ ¼æ¨¡å¼ä¸ä¿çäºå®ä»¬ã
第äºï¼ä¸¥æ ¼æ¨¡å¼ç¦æ¢äºä¸å¨èæ¬æè 彿°å±é¢ä¸ç彿°å£°æã卿µè§å¨çæ®é代ç ä¸ï¼å¨âææå°æ¹âç彿°å£°æé½æ¯åæ³çãè¿å¹¶ä¸å¨ ES5 è§èä¸ï¼çè³æ¯ ES3ï¼ï¼è¿æ¯ä¸ç§é对ä¸åæµè§å¨ä¸ä¸åè¯ä¹çä¸ç§å»¶ä¼¸ãæªæ¥ç ECMAScript çæ¬å¾æå¸æå¶å®ä¸ä¸ªæ°çï¼é对ä¸å¨èæ¬æè 彿°å±é¢è¿è¡å½æ°å£°æçè¯æ³ãå¨ä¸¥æ ¼æ¨¡å¼ä¸ç¦æ¢è¿æ ·ç彿°å£°æå¯¹äºå°æ¥ ECMAScript çæ¬çæ¨åºæ«æ¸ äºéç¢ï¼
"use strict";
if (true) {
function f() {} // !!! è¯æ³é误
f();
}
for (var i = 0; i < 5; i++) {
function f2() {} // !!! è¯æ³é误
f2();
}
function baz() {
// åæ³
function eit() {} // åæ ·åæ³
}
è¿ç§ç¦æ¢æ¾å°ä¸¥æ ¼æ¨¡å¼ä¸å¹¶ä¸æ¯å¾åéï¼å ä¸ºè¿æ ·ç彿°å£°ææ¹å¼ä» ES5 ä¸å»¶ä¼¸åºæ¥çãä½è¿æ¯ ECMAScript å§å伿¨èçåæ³ï¼æµè§å¨å°±å®ç°äºè¿ä¸ç¹ã
æµè§å¨çä¸¥æ ¼æ¨¡å¼ä¸»æµæµè§å¨ç°å¨å®ç°äºä¸¥æ ¼æ¨¡å¼ã使¯ä¸è¦ç²ç®å°ä¾èµå®ï¼å 为å¸åºä¸ä»ç¶æå¤§éçæµè§å¨çæ¬åªé¨åæ¯æä¸¥æ ¼æ¨¡å¼æè æ ¹æ¬å°±ä¸æ¯æï¼æ¯å¦ IE10 ä¹åççæ¬ï¼ãä¸¥æ ¼æ¨¡å¼æ¹åäºè¯ä¹ãä¾èµè¿äºæ¹åå¯è½ä¼å¯¼è´æ²¡æå®ç°ä¸¥æ ¼æ¨¡å¼çæµè§å¨ä¸åºç°é®é¢æè é误ãè°¨æ å°ä½¿ç¨ä¸¥æ ¼æ¨¡å¼ï¼éè¿æ£æµç¸å ³ä»£ç çåè½ä¿è¯ä¸¥æ ¼æ¨¡å¼ä¸åºé®é¢ãæåï¼è®°å¾å¨æ¯ææè 䏿¯æä¸¥æ ¼æ¨¡å¼çæµè§å¨ä¸æµè¯ä½ ç代ç ãå¦æä½ åªå¨ä¸æ¯æä¸¥æ ¼æ¨¡å¼çæµè§å¨ä¸æµè¯ï¼é£ä¹å¨æ¯æçæµè§å¨ä¸å°±å¾æå¯è½åºé®é¢ï¼åä¹äº¦ç¶ã
åè§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