æ¬ææè®²çå 容对äºå¸®å©çè§£æ§èæ¬å¾æç¨ã
ä½è¿ä¸æ¯æä»¬ç¼åæ°ä»£ç çæ¹å¼ã
卿¬æç¨æå¼å§é£é¨åç åé è¿ç« ä¸ï¼æä»¬æå°äºåé声æçä¸ç§æ¹å¼ï¼
letconstvar
var 声æä¸ let ç¸ä¼¼ã大é¨åæ
åµä¸ï¼æä»¬å¯ä»¥ç¨ let ä»£æ¿ var æè
var ä»£æ¿ letï¼é½è½è¾¾å°é¢æçææï¼
var message = "Hi";
alert(message); // Hi
ä½å®é
ä¸ var å´æ¯ä¸å¤´é常ä¸åçï¼æºèªè¿å¤æ¶ä»£çæªå
½ãå¨ç°ä»£èæ¬ä¸ä¸è¬ä¸å使ç¨å®ï¼ä½å®ä»ç¶æ½ä¼å¨æ§èæ¬ä¸ã
å¦æä½ ä¸æç®æ¥è§¦è¿æ ·çèæ¬ï¼ä½ çè³å¯ä»¥è·³è¿æ¬ç« ææ¨è¿é 读æ¬ç« ã
å¦ä¸æ¹é¢ï¼äºè§£å°æ§èæ¬ä» var è¿ç§»å° let æ¶çåºå«ï¼ä»¥é¿å
奿ªçéè¯¯ï¼æ¯å¾éè¦çã
âvarâ æ²¡æå级ä½ç¨å
ç¨ var 声æçåéï¼ä¸æ¯å½æ°ä½ç¨åå°±æ¯å
¨å±ä½ç¨åãå®ä»¬å¨ä»£ç åå¤ä¹æ¯å¯è§çï¼è¯æ³¨ï¼ä¹å°±æ¯è¯´ï¼var 声æçåéåªæå½æ°ä½ç¨ååå
¨å±ä½ç¨åï¼æ²¡æå级ä½ç¨åï¼ã
举个ä¾åï¼
if (true) {
var test = true; // ä½¿ç¨ "var" è䏿¯ "let"
}
alert(test); // trueï¼åéå¨ if ç»æåä»åå¨
ç±äº var ä¼å¿½ç¥ä»£ç åï¼å æ¤æä»¬æäºä¸ä¸ªå
¨å±åé testã
妿æä»¬å¨ç¬¬äºè¡ä½¿ç¨ let test è䏿¯ var testï¼é£ä¹è¯¥åéå°ä»
å¨ if å
é¨å¯è§ï¼
if (true) {
let test = true; // ä½¿ç¨ "let"
}
alert(test); // ReferenceError: test is not defined
对äºå¾ªç¯ä¹æ¯è¿æ ·çï¼var 声æçåéæ²¡æå级ä½ç¨å乿²¡æå¾ªç¯å±é¨ä½ç¨åï¼
for (var i = 0; i < 10; i++) {
var one = 1;
// ...
}
alert(i); // 10ï¼"i" å¨å¾ªç¯ç»æåä»å¯è§ï¼å®æ¯ä¸ä¸ªå
¨å±åé
alert(one); // 1ï¼"one" å¨å¾ªç¯ç»æåä»å¯è§ï¼å®æ¯ä¸ä¸ªå
¨å±åé
妿ä¸ä¸ªä»£ç åä½äºå½æ°å
é¨ï¼é£ä¹ var 声æçåéçä½ç¨åå°ä¸ºå½æ°ä½ç¨åï¼
function sayHi() {
if (true) {
var phrase = "Hello";
}
alert(phrase); // è½æ£å¸¸å·¥ä½
}
sayHi();
alert(phrase); // ReferenceError: phrase is not defined
å¯ä»¥çå°ï¼var ç©¿éäº ifï¼for åå
¶å®ä»£ç åãè¿æ¯å ä¸ºå¨æ©æç JavaScript ä¸ï¼å没æè¯æ³ç¯å¢ï¼è var å°±æ¯è¿ä¸ªæ¶æç代表ä¹ä¸ã
âvarâ å è®¸éæ°å£°æ
妿æä»¬ç¨ let å¨åä¸ä½ç¨åä¸å°åä¸ä¸ªåé声æä¸¤æ¬¡ï¼åä¼åºç°é误ï¼
let user;
let user; // SyntaxError: 'user' has already been declared
ä½¿ç¨ varï¼æä»¬å¯ä»¥éå¤å£°æä¸ä¸ªåéï¼ä¸ç®¡å¤å°æ¬¡é½è¡ã妿æä»¬å¯¹ä¸ä¸ªå·²ç»å£°æçåéä½¿ç¨ varï¼è¿æ¡æ°ç声æè¯å¥ä¼è¢«å¿½ç¥ï¼
var user = "Pete";
var user = "John"; // è¿ä¸ª "var" æ æï¼å 为åéå·²ç»å£°æè¿äºï¼
// â¦â¦ä¸ä¼è§¦åé误
alert(user); // John
âvarâ 声æçåéï¼å¯ä»¥å¨å ¶å£°æè¯å¥å被使ç¨
å½å½æ°å¼å§çæ¶åï¼å°±ä¼å¤ç var 声æï¼èæ¬å¯å¨å¯¹åºå
¨å±åéï¼ã
æ¢è¨ä¹ï¼var 声æçåéä¼å¨å½æ°å¼å¤´è¢«å®ä¹ï¼ä¸å®å¨ä»£ç ä¸å®ä¹çä½ç½®æ å
³ï¼è¿éä¸èèå®ä¹å¨åµå¥å½æ°ä¸çæ
åµï¼ã
é£ä¹çä¸ä¸è¿æ®µä»£ç ï¼
function sayHi() {
phrase = "Hello";
alert(phrase);
var phrase;
}
sayHi();
â¦â¦ä»ææ¯ä¸è®²ï¼å®ä¸ä¸é¢è¿ç§æ
嵿¯ä¸æ ·çï¼var phrase 被ä¸ç§»è³å½æ°å¼å¤´ï¼ï¼
function sayHi() {
var phrase;
phrase = "Hello";
alert(phrase);
}
sayHi();
â¦â¦çè³ä¸è¿ç§æ åµä¹ä¸æ ·ï¼è®°ä½ï¼ä»£ç 忝ä¼è¢«å¿½ç¥çï¼ï¼
function sayHi() {
phrase = "Hello"; // (*)
if (false) {
var phrase;
}
alert(phrase);
}
sayHi();
人们å°è¿ç§è¡ä¸ºç§°ä¸ºâæåâï¼è±æä¸º âhoistingâ æ âraisingâï¼ï¼å 为ææç var é½è¢«âæåâå°äºå½æ°çé¡¶é¨ã
æä»¥ï¼å¨ä¸é¢çä¾åä¸ï¼if (false) åæ¯æ°¸è¿é½ä¸ä¼æ§è¡ï¼ä½æ²¡å
³ç³»ï¼å®éé¢ç var å¨å½æ°åå¼å§æ¶å°±è¢«å¤çäºï¼æä»¥å¨æ§è¡ (*) é£è¡ä»£ç æ¶ï¼å鿝åå¨çã
声æä¼è¢«æåï¼ä½æ¯èµå¼ä¸ä¼ã
æä»¬æå¥½ç¨ä¾åæ¥è¯´æï¼
function sayHi() {
alert(phrase);
var phrase = "Hello";
}
sayHi();
var phrase = "Hello" è¿è¡ä»£ç å
å«ä¸¤ä¸ªè¡ä¸ºï¼
- 使ç¨
var声æåé - 使ç¨
=ç»åéèµå¼ã
声æå¨å½æ°åå¼å§æ§è¡çæ¶åï¼âæåâï¼å°±è¢«å¤çäºï¼ä½æ¯èµå¼æä½å§ç»æ¯å¨å®åºç°çå°æ¹æèµ·ä½ç¨ãæä»¥è¿æ®µä»£ç å®é 䏿¯è¿æ ·å·¥ä½çï¼
function sayHi() {
var phrase; // å¨å½æ°åå¼å§æ¶è¿è¡åé声æ
alert(phrase); // undefined
phrase = "Hello"; // â¦â¦èµå¼ â å½ç¨åºæ§è¡å°è¿ä¸è¡æ¶ã
}
sayHi();
å 为ææç var 声æé½æ¯å¨å½æ°å¼å¤´å¤ççï¼æä»¬å¯ä»¥å¨ä»»ä½å°æ¹å¼ç¨å®ä»¬ã使¯å¨å®ä»¬è¢«èµå¼ä¹å齿¯ undefinedã
ä¸é¢ä¸¤ä¸ªä¾åä¸ï¼alert è¿è¡é½ä¸ä¼æ¥éï¼å 为åé phrase æ¯åå¨çã使¯å®è¿æ²¡æè¢«èµå¼ï¼æä»¥æ¾ç¤º undefiendã
IIFE
å¨ä¹åï¼JavaScript ä¸åªæ var è¿ä¸ç§å£°æåéçæ¹å¼ï¼å¹¶ä¸è¿ç§æ¹å¼å£°æçåéæ²¡æå级ä½ç¨åï¼ç¨åºå们就åæäºä¸ç§æ¨¡ä»¿å级ä½ç¨åçæ¹æ³ãè¿ç§æ¹æ³è¢«ç§°ä¸ºâç«å³è°ç¨å½æ°è¡¨è¾¾å¼âï¼immediately-invoked function expressionsï¼IIFEï¼ã
å¦ä»ï¼æä»¬ä¸åºè¯¥åä½¿ç¨ IIFE äºï¼ä½æ¯ä½ å¯ä»¥å¨æ§èæ¬ä¸æ¾å°å®ä»¬ã
IIFE çèµ·æ¥åè¿æ ·ï¼
(function() {
var message = "Hello";
alert(message); // Hello
})();
è¿éï¼å建äºä¸ä¸ªå½æ°è¡¨è¾¾å¼å¹¶ç«å³è°ç¨ãå æ¤ï¼ä»£ç ç«å³æ§è¡å¹¶æ¥æäºèªå·±çç§æåéã
彿°è¡¨è¾¾å¼è¢«æ¬å· (function {...}) å
裹起æ¥ï¼å ä¸ºå½ JavaScript 弿å¨ä¸»ä»£ç ä¸éå° "function" æ¶ï¼å®ä¼æå®å½æä¸ä¸ªå½æ°å£°æçå¼å§ãä½å½æ°å£°æå¿
é¡»æä¸ä¸ªå½æ°åï¼æä»¥è¿æ ·ç代ç ä¼å¯¼è´é误ï¼
// å°è¯å£°æå¹¶ç«å³è°ç¨ä¸ä¸ªå½æ°
function() { // <-- SyntaxError: Function statements require a function name
var message = "Hello";
alert(message); // Hello
}();
å³ä½¿æä»¬è¯´ï¼â好å§ï¼é£æä»¬å ä¸ä¸ªåç§°å§âï¼ä½å®ä»ç¶ä¸å·¥ä½ï¼å 为 JavaScript ä¸å 许ç«å³è°ç¨å½æ°å£°æï¼
// ä¸é¢çæ¬å·ä¼å¯¼è´è¯æ³é误
function go() {
}(); // <-- ä¸è½ç«å³è°ç¨å½æ°å£°æ
å æ¤ï¼éè¦ä½¿ç¨åæ¬å·æè¯¥å½æ°è¡¨è¾¾å¼å èµ·æ¥ï¼ä»¥åè¯ JavaScriptï¼è¿ä¸ªå½æ°æ¯å¨å¦ä¸ä¸ªè¡¨è¾¾å¼çä¸ä¸æä¸å建çï¼å æ¤å®æ¯ä¸ä¸ªå½æ°è¡¨è¾¾å¼ï¼å®ä¸éè¦å½æ°åï¼å¯ä»¥ç«å³è°ç¨ã
é¤äºä½¿ç¨æ¬å·ï¼è¿æå ¶ä»æ¹å¼å¯ä»¥åè¯ JavaScript å¨è¿æä»¬æçæ¯å½æ°è¡¨è¾¾å¼ï¼
// å建 IIFE çæ¹æ³
(function() {
alert("Parentheses around the function");
})();
(function() {
alert("Parentheses around the whole thing");
}());
!function() {
alert("Bitwise NOT operator starts the expression");
}();
+function() {
alert("Unary plus starts the expression");
}();
å¨ä¸é¢çæææ åµä¸ï¼æä»¬é½å£°æäºä¸ä¸ªå½æ°è¡¨è¾¾å¼å¹¶ç«å³è¿è¡å®ãè¯·åæ³¨æä¸ä¸ï¼å¦ä»æä»¬æ²¡æçç±æ¥ç¼åè¿æ ·ç代ç ã
æ»ç»
var ä¸ let/const æä¸¤ä¸ªä¸»è¦çåºå«ï¼
var声æçåéæ²¡æå级ä½ç¨åï¼å®ä»¬ä» å¨å½å彿°å å¯è§ï¼æè å ¨å±å¯è§ï¼å¦æå鿝å¨å½æ°å¤å£°æçï¼ãvaråé声æå¨å½æ°å¼å¤´å°±ä¼è¢«å¤çï¼èæ¬å¯å¨å¯¹åºå ¨å±åéï¼ã
æ¶åå ¨å±å¯¹è±¡æ¶ï¼è¿æä¸ä¸ªé常å°çå·®å¼ï¼æä»¬å°å¨ä¸ä¸ç« ä¸ä»ç»ã
è¿äºå·®å¼ä½¿ var å¨å¤§å¤æ°æ
åµä¸é½æ¯ let æ´ç³ç³ãå级ä½ç¨åæ¯è¿ä¹å¥½çä¸ä¸ªä¸è¥¿ãè¿å°±æ¯ let å¨å å¹´å就被åå
¥å°æ åä¸çåå ï¼å¹¶ä¸ç°å¨ï¼ä¸ const ä¸èµ·ï¼å·²ç»æä¸ºäºå£°æåéçä¸»è¦æ¹å¼ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼