éå ï¼Closureï¼æ¯å½å¼ä»¥å該å½å¼è¢«å®£åææå¨çä½ç¨åç°å¢ï¼lexical environmentï¼ççµåã
èªæ³ä½ç¨åï¼Lexical scopingï¼æèéåä¾åï¼
function init() {
var name = "Mozilla"; // name æ¯åç± init 建ç«çå±é¨è®æ¸
function displayName() {
// displayName() æ¯å
§é¨å½å¼ï¼ä¸åéå
alert(name); // 使ç¨äºç¶å½å¼å®£åçè®æ¸
}
displayName();
}
init();
init()
建ç«äºå±é¨è®æ¸ name
è displayName()
å½å¼ãdisplayName()
æ¯åå¨ init()
å
§å®ç¾©çå
§é¨å½å¼ï¼ä¸åªå¨è©²å½å¼å
§ååãdisplayName()
èªå·±ä¸¦æ²æå±é¨è®æ¸ï¼ä¸éå®å¯ä»¥è¨ªåå¤é¢å½å¼çè®æ¸ãå èè½åç¨å¨ç¶å½å¼å®£åçè®æ¸ name
ã
éè¡éåç¨å¼ç¢¼ä¸¦æ³¨æ displayName()
裡é¢ç alert()
宣åï¼å®è½é¡¯ç¤ºä½æ¼ä¸ä¸å±¤ç name
è®æ¸ãé實ä¾å¨æè¿°èªæ³ä½ç¨å碰ä¸å·¢çå½å¼æï¼è§£æå¨ï¼parserï¼æå¦ä½è§£è®ï¼resolveï¼è®æ¸ããä½ç¨åãä¸è©ï¼æçæ£æ¯ä½ç¨åç°å¢å¨ç¨å¼ç¢¼æå®è®æ¸æï¼ä½¿ç¨ location 便±ºå®è©²è®æ¸ç¨å¨åªè£¡çäºæ
ãå·¢çå½å¼çå
§é¨å½å¼ï¼è½è¨ªåå¨è©²å½å¼ä½ç¨åä¹å¤çè®æ¸ã
åæèéåä¾åï¼
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
è¥ä½ å·è¡éåç¨å¼ç¢¼ï¼å®æèåä¾ init()
æç¸åçµæï¼å串 Mozilla æä»¥ JavaScript alert æç¤ºé¡¯ç¤ºåºä¾ãä½ç®ä¸ä¸åãä¸é å
·è¶£å³èï¼ä¹å
§é¨å½å¼ displayName()
ç«å¨å¤é¨å½å¼å·è¡åï¼å¾å
¶åå³ã
ä¹çä¹ä¸ï¼é段ç¨å¼ç¢¼çä¾ä¸å¤§ç´è¦ºï¼å¨æäºç¨å¼èªè¨ï¼å½å¼å
§çå±é¨è®æ¸ï¼åªæå¨å½å¼çå·è¡æéåå¨ãç¶ makeFunc()
å·è¡å®ï¼ä½ å¯è½æé æ name è®æ¸åä¹ç¡æ³ä½¿ç¨ãä½é段è½ç
§èéè¡çç¨å¼ç¢¼è¡¨æäºï¼å¨ JavaScript 䏦䏿¯é樣åã
ç®ä¸çç±å JavaScript å½å¼çéå
æéãéå
çºå½å¼ççµåãéæè©²å®£åå½å¼çä½ç¨åç°å¢ãéåç°å¢å
å«éå
å»ºç«æï¼ææä½æ¼è©²ä½ç¨åçååè®æ¸ãå¨éåä¾åä¸ï¼myFunc
æ¯ displayName
å¨ makeFunc
éè¡ææå»ºç«ç實ä¾ï¼instanceï¼åç
§ãdisplayName
ç實ä¾ä¿æäºå
¶ä½ç¨åç°å¢çåç
§ï¼ä½ç¨å裡åå
§å« name
è®æ¸ãå æ¤ï¼å¨èª¿ç¨ myFunc
æï¼name
è®æ¸è¢«ä¿åã並è½ä½å®ç¨ããMozillaãä¸è©ä¹å æ¤å³çµ¦äº alert
ã
é裡æåæ´æè¶£çä¾åï¼makeAdder
å½å¼ï¼
function makeAdder(x) {
return function (y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
卿¤ï¼æåå®ç¾©ä¸å帶æå®ä¸åæ¸ x
並å峿°å½å¼çå½å¼ makeAdder(x)
ã該æ°å½å¼å帶æ y
忏䏦åå³äº x
è y
ç總åã
æ¬è³ªä¸ makeAdder
ä¹çºå½å¼å·¥å» ï¼å®æ¯å建ç«çµ¦å®å¼ã並èå
¶åæ¸æ±åä¹å½å¼ãä¸ä¾ä¸æåçå½å¼å·¥å» 建ç«äºå
©åæ°å½å¼ï¼ä¸åçµ¦åæ¸å 5ï¼å¦ä¸å忝 10ã
add5
è add10
齿¯éå
ãä»åå
±äº«å½å¼çå®ç¾©ï¼å»ä¿æä¸åçç°å¢ï¼å¨ add5
çä½ç¨åç°å¢ï¼x
æ¯ 5ãèå¨ add10
çä½ç¨åç°å¢ï¼ x
忝 10ã
éå 實ç¨ä¹èï¼å¨æ¼è½è®ä½ æä¸äºè³æï¼ééä½ç¨åç°å¢ï¼èææ§éäºè³æçå½å¼ç¸éè¯ã徿顝å°ï¼éèæä¸äºè³æï¼ç©ä»¶å±¬æ§ï¼èä¸äºæ¹æ³çç¸éè¯çç©ä»¶å°åç¨å¼è¨è¨ï¼object-oriented programmingï¼ç¸ä¼¼ã
å æ¤ï¼å¨ä½¿ç¨åªå«ä¸åæ¹æ³çç©ä»¶ä¹èï¼é常ä¹å¯ä»¥ä½¿ç¨éå ã
å¨ Web ä¸ï¼è©¦ååé種äºçæ æ³éè »æ®éçãæå寫ç大夿¸å端 JavaScript ç¨å¼ç¢¼å±¬æ¼ event-based çï¼æåå®ç¾©äºä¸äºè¡çºï¼æ¥èæå®èç¨æ¶è§¸ç¼äºä»¶ï¼ä¾å¦é»æææéµï¼é£çµèµ·ä¾ãç¨å¼ç¢¼é常æä»¥ callback çå½¢å¼é£çµï¼ä¹å°±æ¯ä¸åèçäºä»¶åæçå½å¼ã
ä¾å¦ï¼åè¨æåæ³å¨ç¶²é ä¸ï¼å åè½èª¿æ´æå大å°çæéãå
¶ä¸ä¸åæ¹æ³æ¯ç¨åç´ æå® body
å
ç´ ç font-sizeï¼æ¥èééç¸å°ç em å®ä½ï¼è¨ç½®å
¶ä»é é¢çå
¶ä»å
ç´ ï¼å¦ headersï¼å大å°ï¼
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
}
h1 {
font-size: 1.5em;
}
h2 {
font-size: 1.2em;
}
æåçäºå弿å大尿éï¼å¯ä»¥æ¹è® body
å
ç´ ç font-size
屬æ§ï¼propertyï¼ä¸¦èç±ç¸å°å®ä½ä»¤é é¢å
¶ä»å
ç´ æ¥åç¸æèª¿æ´ã
以䏿¯ JavaScriptï¼
function makeSizer(size) {
return function () {
document.body.style.fontSize = size + "px";
};
}
var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);
size12
ãsize14
ãsize16
ç¾å¨è®æè½èª¿æ´åé«å¤§å°å° 12ã14ãè 16 åç´ çå½å¼ãèæåè½å¦ä¸ä¾ä¸è¬ï¼æä»åéå å°æéä¸ï¼æ¬ä¾çºé£çµï¼ï¼
document.getElementById("size-12").onclick = size12;
document.getElementById("size-14").onclick = size14;
document.getElementById("size-16").onclick = size16;
<a href="#" id="size-12">12</a>
<a href="#" id="size-14">14</a>
<a href="#" id="size-16">16</a>
使ç¨éå
模æ¬ç§ææ¹æ³
è«¸å¦ Java ä¹é¡çç¨å¼èªè¨ï¼æä¾äºç§ææ¹æ³å®£åçè½åï¼æå³èå®ååªè½è¢«åä¸å class çå ¶ä»æ¹æ³å¼å«ã
JavaScript ä¸¦æ²æçæä¾åççæ¹æ³å®æé種äºï¼ä¸éå®èç±éå 便¨¡æ¬ç§ææ¹æ³ãç§ææ¹æ³ä¸åªè½éå¶ç¨å¼ç¢¼çååï¼å®éæä¾äºå¼·èæåçæ¹å¼ä¾ç®¡çå ¨åå½å空éï¼é¿å éå¿ è¦çæ¹æ³å¼äºå ¬éä»é¢ã
以ä¸å±ç¤ºå¦ä½ä½¿ç¨éå ä¾å®ç¾©ä¸åè½å¤ 訪åç§æå½å¼èè®æ¸çå ¬éå½å¼ãé種éå çç¨æ³ç¨±çºæ¨¡çµè¨è¨æ¨¡å¼(module pattern)ã
var counter = (function () {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function () {
changeBy(1);
},
decrement: function () {
changeBy(-1);
},
value: function () {
return privateCounter;
},
};
})();
console.log(counter.value()); // logs 0
counter.increment();
counter.increment();
console.log(counter.value()); // logs 2
counter.decrement();
console.log(counter.value()); // logs 1
ä¸ä¾çæ¯åéå
ï¼é½æåèªçç°å¢ãå³ä½¿å¦æ¤ï¼æåä¾è建ç«äºä¸åï¼è¢«ä¸åå½å¼å
±äº«çç°å¢ï¼counter.increment
ãcounter.decrement
ãcounter.value
ã
該ä½ç¨åç°å¢ç±å¿åå½å¼ç body 建ç«ï¼ä¹å¾ç«å»å·è¡ãä½ç¨åç°å¢éå
æ¬å
©åç§æé
ï¼private itemï¼ï¼è®æ¸ privateCounter
èå½å¼ changeBy
ãéäºç§æé
ï¼é½ä¸æå¨å¿åå½å¼å¤ç´æ¥è¨ªåãç¸åå°ï¼å®åè¦ééç±å¿åå
è£å¨ï¼anonymous wrapperï¼åå³çå
¬æå½å¼è¨ªåã
éä¸åå
¬æå½å¼ï¼ççºå
±äº«åä¸åç°å¢çéå
ãç±æ¼ JavaScript çèªæ³ä½ç¨åï¼å®åé½è½è¨ªå privateCounter
è®æ¸è changeBy
å½å¼ã
åè¨»ï¼ ä½ æè©²ä¹ç¼ç¾å°æåå®ç¾©äºå»ºç« counter çå¿åå½å¼ãèæåæ¥èå¼å«å®ï¼ä¸¦çµ¦counter
è®æ¸ææ´¾äºåå³å¼ãæåä¹è½å¨åé¢çè®æ¸ makeCounter
å²åå½å¼ä¸¦ç¨å
¶å»ºç«æ¸å counterã
var makeCounter = function () {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function () {
changeBy(1);
},
decrement: function () {
changeBy(-1);
},
value: function () {
return privateCounter;
},
};
};
var counter1 = makeCounter();
var counter2 = makeCounter();
alert(counter1.value()); /* Alerts 0 */
counter1.increment();
counter1.increment();
alert(counter1.value()); /* Alerts 2 */
counter1.decrement();
alert(counter1.value()); /* Alerts 1 */
alert(counter2.value()); /* Alerts 0 */
è«æ³¨æ counter1
è counter2
éå
©åè¨æ¸å¨æ¯å¦ä½ç¶è·å
¶ç¨ç«æ§çãæ¯åéå
é½ä»¥åèªçéå
ï¼å¨åç
§ä¸åçæ¬ç privateCounter
è®æ¸ãæ¯ç¶å¼å«å
¶ä¸ä¸åè¨æ¸å¨æï¼å®æééè©²è®æ¸çæ¸å¼è®æ´ï¼æ¹è®èªæ³ä½ç¨åçç°å¢ãä¸éï¼å¨å
¶ä¸ä¸åéå
çè®æ¸å¼æ¹æï¼å
¶ä»éå
çæ¸å¼ä¸¦ä¸æåå°å½±é¿ã
åè¨»ï¼ ä½¿ç¨éç¨®æ¹æ³çéå ï¼æä¾äºä¸äºèç©ä»¶å°åç¨å¼è¨è¨ççèï¼å°¤å ¶æ¯è³æé±èèå°è£ã
å¨è¿´å建ç«éå ï¼ä¸å常è¦é¯èª¤å¨ ECMAScript 2015 å°å
¥ let
åï¼è¿´åå
§å»ºç«çéå
ï¼å¸¸æç¼çåé¡ãè«æè以ä¸çç¯ä¾ï¼
<p id="help">Helpful notes will appear here</p>
<p>E-mail: <input type="text" id="email" name="email" /></p>
<p>Name: <input type="text" id="name" name="name" /></p>
<p>Age: <input type="text" id="age" name="age" /></p>
function showHelp(help) {
document.getElementById("help").innerHTML = help;
}
function setupHelp() {
var helpText = [
{ id: "email", help: "Your e-mail address" },
{ id: "name", help: "Your full name" },
{ id: "age", help: "Your age (you must be over 16)" },
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
document.getElementById(item.id).onfocus = function () {
showHelp(item.help);
};
}
}
setupHelp();
helpText
é£åå®ç¾©äºä¸åæç¨çæç¤ºï¼æ¯åæç¤ºé½åæä»¶å
§ç輸å
¥å段 ID ç¸éé£ãè¿´åéééä¸åå®ç¾©ï¼ä¾åºéå°ç¸å°æç幫婿¹æ³ï¼help methodï¼æ·»å äº onfocus
äºä»¶ã
è¥è©¦èéè¡é段ç¨å¼ç¢¼ï¼ä½ æç¼ç¾å®ä¸è¥é æè¬éè¡ï¼ç¡è«èç¦åªä¸æ®µï¼è¨æ¯é½æ¯å¨é¡¯ç¤ºä½ ç年齡ã
乿以妿¤ï¼æ¯å çºææ´¾å° onfocus
çå½å¼çºéå
ï¼ä»åçµæå½å¼çå®ç¾©ãä¸¦å¾ setupHelp
çä½ç¨åææå½å¼çç°å¢ãä¸åéå
é½è¢«å»ºç«èµ·ä¾ï¼ä½ä»åå
±äº«åä¸åè½æ¹è®æ¸å¼è®æ¸ï¼item.help
ï¼çä½ç¨åç°å¢ãitem.help
弿©å¨å·è¡ onfocus
å弿ï¼å°±å·²ç¶è¢«æ±ºå®äºãä¹ç±æ¼ course 裡é¢çè¿´åå¨é£æå·²ç¶å·è¡äºï¼çµ¦ä¸åéå
å
±äº«çè®æ¸ç©ä»¶ item
æ©å·²é¢é helpText
æ¸
å®ç pointing to the last entryã
å ¶ä¸ä¸åè§£æ³æ¯ä½¿ç¨æ´å¤éå ï¼å°¤å ¶è¦ä½¿ç¨åè¿°çå½å¼å·¥å» ï¼
function showHelp(help) {
document.getElementById("help").innerHTML = help;
}
function makeHelpCallback(help) {
return function () {
showHelp(help);
};
}
function setupHelp() {
var helpText = [
{ id: "email", help: "Your e-mail address" },
{ id: "name", help: "Your full name" },
{ id: "age", help: "Your age (you must be over 16)" },
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
}
}
setupHelp();
鿬¡å°±å¦åé æè¬çéä½äºãèææå調å
±äº«ä½ç¨åç°å¢ç¸æ¯ï¼makeHelpCallback
給æ¯ååèª¿å»ºç«æ°çä½ç¨åç°å¢ï¼è©²ç°å¢ç help
åç
§å° helpText
é£åçå°æå串ã
ç¨å¿åéå ä¾å¯¦åçå¦ä¸ç¨®æ¹æ³æ¯ï¼
function showHelp(help) {
document.getElementById("help").innerHTML = help;
}
function setupHelp() {
var helpText = [
{ id: "email", help: "Your e-mail address" },
{ id: "name", help: "Your full name" },
{ id: "age", help: "Your age (you must be over 16)" },
];
for (var i = 0; i < helpText.length; i++) {
(function () {
var item = helpText[i];
document.getElementById(item.id).onfocus = function () {
showHelp(item.help);
};
})(); // Immediate event listener attachment with the current value of item (preserved until iteration).
}
}
setupHelp();
å¦æä½ ä¸æ³ç¨æ´å¤éå
ç話ï¼ä½ å¯ä»¥ä½¿ç¨ ES2015 ç let
ééµåï¼
function showHelp(help) {
document.getElementById("help").innerHTML = help;
}
function setupHelp() {
var helpText = [
{ id: "email", help: "Your e-mail address" },
{ id: "name", help: "Your full name" },
{ id: "age", help: "Your age (you must be over 16)" },
];
for (var i = 0; i < helpText.length; i++) {
let item = helpText[i];
document.getElementById(item.id).onfocus = function () {
showHelp(item.help);
};
}
}
setupHelp();
å¨éè£¡ï¼æåç¨äº let
è䏿¯ var
ï¼æä»¥æ¯åéå
é½æèæ¯å block-scoped è®æ¸ç¶å®ï¼å èè½å¨ä¸ç¨æ´å¤éå
çæ
æ³ä¸å®ç¾éè¡ã
妿æå®çä»»åç¡é 使ç¨éå ç話ï¼å¨å ¶ä»å½å¼å §å»ºç«ä¸å¿ è¦çå½å¼ä¸¦ä¸ææºï¼å çºå¾é度åè¨æ¶é«è§åº¦èè¨ï¼å®é½æå½±é¿è ³æ¬æ§è½ã
ä¾å¦èªªï¼ç¶æå建ç«äºæ°ç object/class æåï¼æ¹æ³é常è¦åç©ä»¶çååï¼prototypeï¼ç¸éè¯ï¼è䏿¯å®ç¾©å°ç©ä»¶ç建æ§åï¼constructorï¼ââ 鿝å çºæ¯ç¶å»ºæ§å被å¼å«çæåï¼æ¹æ³é½æéæ°åé ï¼ä¹å°±æ¯èªªï¼å®æ¯æ¬¡é½å¨å»ºç«ç©ä»¶ï¼ã
æèä¸ä¸éåä¾åï¼
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
this.getName = function () {
return this.name;
};
this.getMessage = function () {
return this.message;
};
}
ä¸é¢çç¨å¼ç¢¼ä¸¦æªå©ç¨éå ççèï¼æä»¥ï¼å¯ä»¥æ¹æé忍£åï¼
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
}
MyObject.prototype = {
getName: function () {
return this.name;
},
getMessage: function () {
return this.message;
},
};
使åä¸å»ºè°éæ°å®ç¾©ååï¼å æ¤éåéå å°ç¾æååçä¾åæ´ä½³ï¼
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
}
MyObject.prototype.getName = function () {
return this.name;
};
MyObject.prototype.getMessage = function () {
return this.message;
};
以ä¸çç¨å¼ç¢¼ï¼å¯ä»¥å¯«å¾å¦åä¸ä¾è¬ç°¡æ½ï¼
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
}
(function () {
this.getName = function () {
return this.name;
};
this.getMessage = function () {
return this.message;
};
}).call(MyObject.prototype);
å¨åä¾ä¸ï¼ææç©ä»¶å¯å ±äº«ç¹¼æ¿çååï¼ç©ä»¶åµç«æä¹ç¡é æ¯æ¬¡é½å®ç¾©æ¹æ³ãè©³ç´°è³æè«åè¦æ·±å ¥äºè§£ç©ä»¶æ¨¡åã
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