æ¬ææè®²çæ¯ä¸ä¸ªé«é¶ä¸»é¢ï¼è½å¸®ä½ æ´å¥½å°çè§£ä¸äºè¾¹ç¼æ åµã
è¿ä» æ¯é¦ä¸æ·»è±ã许å¤ç»éªä¸°å¯çå¼åè ä¸çäºäºä¹è¿å¾ä¸éãå¦æä½ æ³äºè§£ä»£ç è¿è¡çæ¬è´¨ï¼é£å°±ç»§ç»è¯»ä¸å»å§ã
ä¸ä¸ªå¨ææ§è¡çæ¹æ³è°ç¨å¯è½ä¼ä¸¢å¤± thisã
ä¾å¦ï¼
let user = {
name: "John",
hi() { alert(this.name); },
bye() { alert("Bye"); }
};
user.hi(); // æ£å¸¸è¿è¡
// ç°å¨è®©æä»¬åºäº name æ¥éæ©è°ç¨ user.hi æ user.bye
(user.name == "John" ? user.hi : user.bye)(); // Error!
卿åä¸è¡æä¸ªå¨ user.hi å user.bye ä¸åéæ©çæ¡ä»¶ï¼ä¸å
ï¼è¿ç®ç¬¦ãå½åæ
å½¢ä¸çç»ææ¯ user.hiã
æ¥çè¯¥æ¹æ³è¢«éè¿ () ç«å»è°ç¨ã使¯å¹¶ä¸è½æ£å¸¸å·¥ä½ï¼
å¦ä½ æè§ï¼æ¤å¤è°ç¨å¯¼è´äºä¸ä¸ªé误ï¼å 为å¨è¯¥è°ç¨ä¸ "this" çå¼åæäº undefinedã
è¿æ ·æ¯è½å·¥ä½çï¼å¯¹è±¡.æ¹æ³ï¼ï¼
user.hi();
è¿å°±æ æ³å·¥ä½äºï¼è¢«è¯ä¼°çæ¹æ³ï¼ï¼
(user.name == "John" ? user.hi : user.bye)(); // Error!
为ä»ä¹å¢ï¼æ¬²ç¥ç¼ä½ï¼ä¸è®©æä»¬æ·±å
¥ obj.method() è°ç¨è¿è¡çæ¬è´¨ã
Reference type 解读
ä»ç»ççè¯ï¼æä»¬å¯è½æ³¨æå° obj.method() è¯å¥ä¸ç两个æä½ï¼
- é¦å
ï¼ç¹
'.'åäºå±æ§obj.methodçå¼ã - æ¥ç
()æ§è¡äºå®ã
é£ä¹ï¼this çä¿¡æ¯æ¯æä¹ä»ç¬¬ä¸é¨åä¼ éå°ç¬¬äºé¨åçå¢ï¼
妿æä»¬å°è¿äºæä½æ¾å¨ä¸åçè¡ï¼this å¿
宿¯ä¼ä¸¢å¤±çï¼
let user = {
name: "John",
hi() { alert(this.name); }
};
// æè·åæ¹æ³åè°ç¨æ¹æ³ææä¸¤è¡
let hi = user.hi;
hi(); // æ¥éäºï¼å 为 this ç弿¯ undefined
è¿é hi = user.hi æå½æ°èµå¼ç»äºä¸ä¸ªåéï¼æ¥ä¸æ¥å¨æåä¸è¡å®æ¯å®å
¨ç¬ç«çï¼æä»¥è¿é没æ thisã
ä¸ºç¡®ä¿ user.hi() è°ç¨æ£å¸¸è¿è¡ï¼JavaScript ç©äºä¸ªå°ææ ââ ç¹ '.' è¿åç䏿¯ä¸ä¸ªå½æ°ï¼èæ¯ä¸ä¸ªç¹æ®ç Reference Type çå¼ã
Reference Type æ¯ ECMA ä¸çä¸ä¸ªâè§èç±»åâãæä»¬ä¸è½ç´æ¥ä½¿ç¨å®ï¼ä½å®è¢«ç¨å¨ JavaScript è¯è¨å é¨ã
Reference Type ç弿¯ä¸ä¸ªä¸ä¸ªå¼çç»å (base, name, strict)ï¼å
¶ä¸ï¼
baseæ¯å¯¹è±¡ãnameæ¯å±æ§åãstrictå¨use strict模å¼ä¸ä¸º trueã
坹屿§ user.hi 访é®çç»æä¸æ¯ä¸ä¸ªå½æ°ï¼èæ¯ä¸ä¸ª Reference Type çå¼ãå¯¹äº user.hiï¼å¨ä¸¥æ ¼æ¨¡å¼ä¸æ¯ï¼
// Reference Type çå¼
(user, "hi", true)
å½ () è¢«å¨ Reference Type ä¸è°ç¨æ¶ï¼å®ä»¬ä¼æ¥æ¶å°å
³äºå¯¹è±¡åå¯¹è±¡çæ¹æ³ç宿´ä¿¡æ¯ï¼ç¶åå¯ä»¥è®¾ç½®æ£ç¡®ç thisï¼å¨æ¤å¤ =userï¼ã
Reference Type æ¯ä¸ä¸ªç¹æ®çâä¸é´äººâå
é¨ç±»åï¼ç®çæ¯ä» . ä¼ éä¿¡æ¯ç» () è°ç¨ã
ä»»ä½ä¾å¦èµå¼ hi = user.hi çå
¶ä»çæä½ï¼é½ä¼å° Reference Type ä½ä¸ºä¸ä¸ªæ´ä½ä¸¢å¼æï¼èä¼å user.hiï¼ä¸ä¸ªå½æ°ï¼çå¼å¹¶ç»§ç»ä¼ éãæä»¥ä»»ä½åç»æä½é½â丢失âäº thisã
å æ¤ï¼this çå¼ä»
å¨å½æ°ç´æ¥è¢«éè¿ç¹ç¬¦å· obj.method() ææ¹æ¬å· obj['method']() è¯æ³ï¼æ¤å¤å®ä»¬ä½ç¨ç¸åï¼è°ç¨æ¶æè¢«æ£ç¡®ä¼ éãè¿æå¾å¤ç§è§£å³è¿ä¸ªé®é¢çæ¹å¼ï¼ä¾å¦ func.bind()ã
æ»ç»
Reference Type æ¯è¯è¨å é¨çä¸ä¸ªç±»åã
读åä¸ä¸ªå±æ§ï¼ä¾å¦å¨ obj.method() ä¸ï¼. è¿åçåç¡®æ¥è¯´ä¸æ¯å±æ§çå¼ï¼èæ¯ä¸ä¸ªç¹æ®ç âReference Typeâ å¼ï¼å
¶ä¸å¨åç屿§çå¼åå®çæ¥æºå¯¹è±¡ã
è¿æ¯ä¸ºäºéåçæ¹æ³è°ç¨ () è·åæ¥æºå¯¹è±¡ï¼ç¶åå° this 设为å®ã
å¯¹äºææå ¶å®æä½ï¼Reference Type ä¼èªå¨åæå±æ§çå¼ï¼å¨æä»¬è¿ä¸ªæ åµä¸æ¯ä¸ä¸ªå½æ°ï¼ã
è¿æ´ä¸ªæºå¶å¯¹æä»¬æ¯ä¸å¯è§çãå®ä» å¨ä¸äºå¾®å¦çæ åµä¸æéè¦ï¼ä¾å¦ä½¿ç¨è¡¨è¾¾å¼ä»å¯¹è±¡å¨æå°è·åä¸ä¸ªæ¹æ³æ¶ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼