Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëÀí½âJSCore
 
  4469  次浏览      27
  2018-8-30
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÍøÂ磬±¾ÎÄÖ÷Òª½éÉÜÈÃä¯ÀÀÆ÷Äܹ»Õý³£¹¤×÷×îºËÐĵIJ¿·Ö¾ÍÊÇä¯ÀÀÆ÷µÄÄںˣ¬Ã¿¸öä¯ÀÀÆ÷¶¼ÓÐ×Ô¼ºµÄÄںˣ¬SafariµÄÄں˾ÍÊÇWebKit¡£

±³¾°

¶¯Ì¬»¯×÷ÎªÒÆ¶¯¿Í»§¶Ë¼¼ÊõµÄÒ»¸öÖØÒª·ÖÖ§£¬Ò»Ö±ÊÇÒµ½ç»ý¼«Ì½Ë÷µÄ·½Ïò¡£Ä¿Ç°Òµ½çÁ÷ÐеĶ¯Ì¬»¯·½°¸£¬ÈçFacebookµÄReact Native£¬°¢Àï°Í°ÍµÄWeex¶¼²ÉÓÃÁËǰ¶ËϵµÄDSL·½°¸£¬¶øËüÃÇÔÚiOSϵͳÉÏÄܹ»Ë³ÀûµÄÔËÐУ¬¶¼Àë²»¿ªÒ»¸ö±³ºóµÄ¹¦³¼£ºJavaScriptCore£¨ÒÔϼò³ÆJSCore£©£¬Ëü½¨Á¢ÆðÁËObjective-C£¨ÒÔϼò³ÆOC£©ºÍJavaScript£¨ÒÔϼò³ÆJS£©Á½ÃÅÓïÑÔÖ®¼ä¹µÍ¨µÄÇÅÁº¡£ÎÞÂÛÊÇÕâЩÁ÷ÐеĶ¯Ì¬»¯·½°¸£¬»¹ÊÇWebView Hybrid·½°¸£¬Òà»òÊÇ֮ǰ¹ã·ºÁ÷ÐеÄJSPatch£¬JSCore¶¼ÔÚÆäÖз¢»ÓÁ˾Ù×ãÇáÖØµÄ×÷Óá£×÷ΪһÃûiOS¿ª·¢¹¤³Ìʦ£¬Á˽âJSCoreÒѾ­Öð½¥³ÉΪÁ˱ر¸¼¼ÄÜÖ®Ò»¡£

´Óä¯ÀÀÆ÷̸Æð

ÔÚiOS 7Ö®ºó£¬JSCore×÷Ϊһ¸öϵͳ¼¶Framework±»Æ»¹ûÌṩ¸ø¿ª·¢Õß¡£JSCore×÷Ϊƻ¹ûµÄä¯ÀÀÆ÷ÒýÇæWebKitÖÐÖØÒª×é³É²¿·Ö£¬Õâ¸öJSÒýÇæÒѾ­´æÔÚ¶àÄê¡£Èç¹ûÏëÈ¥×·±¾ËÝÔ´£¬Ì½¾¿JSCoreµÄ°ÂÃØ£¬ÄÇô¾ÍÓ¦¸Ã´ÓJSÕâÃÅÓïÑԵĵ®Éú£¬ÒÔ¼°Ëü×îÖØÒªµÄËÞÖ÷-Safariä¯ÀÀÆ÷¿ªÊ¼Ì¸Æð¡£

JavaScriptÀúÊ·¼ò½é

JavaScriptµ®ÉúÓÚ1995Ä꣬ËüµÄÉè¼ÆÕßÊÇNetscapeµÄBrendan Eich£¬¶ø´ËʱµÄNetscapeÕýÊÇä¯ÀÀÆ÷Êг¡µÄ°ÔÖ÷¡£

¶ø¶þÊ®¶àÄêǰ£¬µ±Ê±ÈËÃÇÔÚä¯ÀÀÍøÒ³µÄÌåÑ鼫²î£¬ÒòΪÄÇ»á¶ùµÄä¯ÀÀÆ÷¼¸ºõÖ»ÓÐÒ³ÃæµÄչʾÄÜÁ¦£¬Ã»ÓкÍÓû§µÄ½»»¥Âß¼­´¦ÀíÄÜÁ¦¡£ËùÒÔ¼´Ê¹Ò»¸ö±ØÌîÊäÈë¿ò´«¿Õ£¬Ò²ÐèÒª¾­¹ý·þÎñ¶ËÑéÖ¤£¬µÈµ½·µ»Ø½á¹ûÖ®ºó²Å¸ø³öÏìÓ¦£¬ÔÙ¼ÓÉϵ±Ê±µÄÍøËÙºÜÂý£¬¿ÉÄܰë·ÖÖÓ¹ýÈ¥ÁË£¬·µ»ØµÄ½á¹ûÊǸæËßÄãij¸ö±ØÌî×Ö¶ÎδÌî¡£ËùÒÔBrendan»¨ÁËÊ®Ììд³öÁËJavaScript£¬ÓÉä¯ÀÀÆ÷½âÊÍÖ´ÐУ¬´Ó´ËÖ®ºóä¯ÀÀÆ÷Ò²ÓÐÁËһЩ»ù±¾µÄ½»»¥´¦ÀíÄÜÁ¦£¬ÒÔ¼°±íµ¥Êý¾ÝÑéÖ¤ÄÜÁ¦¡£

¶øBrendan¿ÉÄÜûÓÐÏëµ½£¬ÔÚ¶þÊ®¶àÄêºóµÄ½ñÌì¡£JSÕâÃŽâÊÍÖ´ÐеĶ¯Ì¬½Å±¾ÓïÑÔ£¬²»¹â³ÉΪǰ¶Ë½ìµÄ¡°Õýͳ¡±£¬»¹ÈëÇÖÁ˺ó¶Ë¿ª·¢ÁìÓò£¬ÔÚ±à³ÌÓïÑÔÅÅÐаñÉϽøÈëǰÈý¼×£¬½ö´ÎÓÚPythonºÍJava¡£¶øÈçºÎ½âÊÍÖ´ÐÐJS£¬ÔòÊǸ÷¼ÒÒýÇæµÄºËÐļ¼Êõ¡£Ä¿Ç°ÊÐÃæÉϱȽϳ£¼ûµÄJSÒýÇæÓÐGoogleµÄV8£¨Ëü±»ÔËÓÃÔÚAndroid²Ù×÷ϵͳÒÔ¼°GoogleµÄChromeÉÏ£©£¬ÒÔ¼°ÎÒÃǽñÌìµÄÖ÷½Ç--JSCore£¨Ëü±»ÔËÓÃÔÚiOS²Ù×÷ϵͳÒÔ¼°SafariÉÏ£©¡£

WebKit

ÎÒÃÇÿÌì¶¼»á½Ó´¥ä¯ÀÀÆ÷£¬Ê¹ÓÃä¯ÀÀÆ÷½øÐй¤×÷¡¢ÓéÀÖ¡£ÈÃä¯ÀÀÆ÷Äܹ»Õý³£¹¤×÷×îºËÐĵIJ¿·Ö¾ÍÊÇä¯ÀÀÆ÷µÄÄںˣ¬Ã¿¸öä¯ÀÀÆ÷¶¼ÓÐ×Ô¼ºµÄÄںˣ¬SafariµÄÄں˾ÍÊÇWebKit¡£WebKitµ®ÉúÓÚ1998Ä꣬²¢ÓÚ2005ÄêÓÉApple¹«Ë¾¿ªÔ´£¬GoogleµÄBlinkÒ²ÊÇÔÚWebKitµÄ·ÖÖ§ÉϽøÐпª·¢µÄ¡£

WebKitÓɶà¸öÖØÒªÄ£¿é×é³É£¬Í¨¹ýÏÂͼÎÒÃÇ¿ÉÒÔ¶ÔWebKitÓиöÕûÌåµÄÁ˽⣺

¼òµ¥µã½²£¬WebKit¾ÍÊÇÒ»¸öÒ³ÃæäÖȾÒÔ¼°Âß¼­´¦ÀíÒýÇæ£¬Ç°¶Ë¹¤³Ìʦ°ÑHTML¡¢JavaScript¡¢CSSÕâ¡°Èý¼ÝÂí³µ¡±×÷ΪÊäÈ룬¾­¹ýWebKitµÄ´¦Àí£¬¾ÍÊä³ö³ÉÁËÎÒÃÇÄÜ¿´µ½ÒÔ¼°²Ù×÷µÄWebÒ³Ãæ¡£´ÓÉÏͼÎÒÃÇ¿ÉÒÔ¿´³öÀ´£¬WebKitÓÉͼÖпòסµÄËĸö²¿·Ö×é³É¡£¶øÆäÖÐ×îÖ÷ÒªµÄ¾ÍÊÇWebCoreºÍJSCore£¨»òÕßÊÇÆäËüJSÒýÇæ£©£¬ÕâÁ½²¿·ÖÎÒÃÇ»á·Ö³ÉÁ½¸öСÕ½ÚÏêϸ½²Êö¡£³ý´ËÖ®Í⣬WebKit Embedding APIÊǸºÔðä¯ÀÀÆ÷UIÓëWebKit½øÐн»»¥µÄ²¿·Ö£¬¶øWebKit PortsÔòÊÇÈÃWebkit¸ü¼Ó·½±ãµÄÒÆÖ²µ½¸÷¸ö²Ù×÷ϵͳ¡¢Æ½Ì¨ÉÏ£¬ÌṩµÄһЩµ÷ÓÃNative LibraryµÄ½Ó¿Ú£¬±ÈÈçÔÚäÖȾ²ãÃæ£¬ÔÚiOSϵͳÖУ¬SafariÊǽ»¸øCoreGraphics´¦Àí£¬¶øÔÚAndroidϵͳÖУ¬WebkitÔòÊǽ»¸øSkia¡£

WebCore

ÔÚÉÏÃæµÄWebKit×é³ÉͼÖУ¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖÖ»ÓÐWebCoreÊǺìÉ«µÄ¡£ÕâÊÇÒòΪʱÖÁ½ñÈÕ,WebKitÒѾ­ÓкܶàµÄ·ÖÖ§ÒÔ¼°¸÷´ó³§¼ÒÒ²½øÐÐÁ˺ܶàÓÅ»¯¸ÄÔ죬Ψ¶ÀWebCoreÕâ¸ö²¿·ÖÊÇËùÓÐWebKit¹²ÏíµÄ¡£WebCoreÊÇWebKitÖдúÂë×î¶àµÄ²¿·Ö£¬Ò²ÊÇÕû¸öWebKitÖÐ×îºËÐĵÄäÖȾÒýÇæ¡£ÄÇÊ×ÏÈÎÒÃÇÀ´¿´¿´Õû¸öWebKitµÄäÖȾÁ÷³Ì£º

Ê×ÏÈä¯ÀÀÆ÷ͨ¹ýURL¶¨Î»µ½ÁËÒ»¶ÑÓÉHTML¡¢CSS¡¢JS×é³ÉµÄ×ÊÔ´Îļþ£¬Í¨¹ý¼ÓÔØÆ÷£¨Õâ¸ö¼ÓÔØÆ÷µÄʵÏÖÒ²ºÜ¸´ÔÓ£¬Ôڴ˲»¶à׸Êö£©°Ñ×ÊÔ´Îļþ¸øWebCore¡£Ö®ºóHTML Parser»á°ÑHTML½âÎö³ÉDOMÊ÷£¬CSS Parser»á°ÑCSS½âÎö³ÉCSSOMÊ÷¡£×îºó°ÑÕâÁ½¿ÃÊ÷ºÏ²¢£¬Éú³É×îÖÕÐèÒªµÄäÖȾÊ÷£¬ÔÙ¾­¹ý²¼¾Ö£¬Óë¾ßÌåWebKit PortsµÄäÖȾ½Ó¿Ú£¬°ÑäÖȾÊ÷äÖȾÊä³öµ½ÆÁÄ»ÉÏ£¬³ÉΪÁË×îÖÕ³ÊÏÖÔÚÓû§ÃæÇ°µÄWebÒ³Ãæ¡£

JSCore

¸ÅÊö

ÖÕÓÚ½²µ½ÎÒÃÇÕâÆÚµÄÖ÷½Ç -- JSCore¡£JSCoreÊÇWebKitĬÈÏÄÚǶµÄJSÒýÇæ£¬Ö®ËùÒÔ˵ÊÇĬÈÏÄÚǶ£¬ÊÇÒòΪºÜ¶à»ùÓÚWebKit·ÖÖ§¿ª·¢µÄä¯ÀÀÆ÷ÒýÇæ¶¼¿ª·¢ÁË×Ô¼ÒµÄJSÒýÇæ£¬ÆäÖÐ×î³öÃûµÄ¾ÍÊÇChromeµÄV8¡£ÕâЩJSÒýÇæµÄʹÃü¶¼Ïàͬ£¬ÄǾÍÊǽâÊÍÖ´ÐÐJS½Å±¾¡£¶ø´ÓÉÏÃæµÄäÖȾÁ÷³ÌͼÎÒÃÇ¿ÉÒÔ¿´µ½£¬JSºÍDOMÊ÷Ö®¼ä´æÔÚ×Å»¥Ïà¹ØÁª£¬ÕâÊÇÒòΪä¯ÀÀÆ÷ÖеÄJS½Å±¾×îÖ÷ÒªµÄ¹¦ÄܾÍÊDzÙ×÷DOMÊ÷£¬²¢ÓëÖ®½»»¥¡£Í¬ÑùµÄ£¬ÎÒÃÇҲͨ¹ýÒ»ÕÅͼ¿´ÏÂËüµÄ¹¤×÷Á÷³Ì:

¿ÉÒÔ¿´µ½£¬Ïà±È¾²Ì¬±àÒëÓïÑÔÉú³ÉÓï·¨Ê÷Ö®ºó£¬»¹ÐèÒª½øÐÐÁ´½Ó£¬×°ÔØÉú³É¿ÉÖ´ÐÐÎļþµÈ²Ù×÷£¬½âÊÍÐÍÓïÑÔÔÚÁ÷³ÌÉÏÒª¼ò»¯ºÜ¶à¡£ÕâÕÅÁ÷³ÌͼÓұ߻­¿òµÄ²¿·Ö¾ÍÊÇJSCoreµÄ×é³É²¿·Ö£ºLexer¡¢Parser¡¢LLIntÒÔ¼°JITµÄ²¿·Ö£¨Ö®ËùÒÔJITµÄ²¿·ÖÊÇÓóÈÉ«±ê×¢£¬ÊÇÒòΪ²¢²»ÊÇËùÓеÄJSCoreÖж¼ÓÐJIT²¿·Ö£©¡£½ÓÏÂÀ´ÎÒÃǾʹîÅäÕû¸ö¹¤×÷Á÷³Ì½éÉÜÿһ²¿·Ö£¬ËüÖ÷Òª·ÖΪÒÔÏÂÈý¸ö²¿·Ö£º´Ê·¨·ÖÎö¡¢Óï·¨·ÖÎöÒÔ¼°½âÊÍÖ´ÐС£

PS£ºÑϸñµÄ½²£¬ÓïÑÔ±¾Éí²¢²»´æÔÚ±àÒëÐÍ»òÕßÊǽâÊÍÐÍ£¬ÒòΪÓïÑÔÖ»ÊÇһЩ³éÏóµÄ¶¨ÒåÓëÔ¼Êø£¬²¢²»ÒªÇó¾ßÌåµÄʵÏÖ£¬Ö´Ðз½Ê½¡£ÕâÀï½²JSÊÇÒ»ÃÅ¡°½âÊÍÐÍÓïÑÔ¡±Ö»ÊÇJSÒ»°ãÊDZ»JSÒýÇæ¶¯Ì¬½âÊÍÖ´ÐУ¬¶ø²¢²»ÊÇÓïÑÔ±¾ÉíµÄÊôÐÔ¡£

´Ê·¨·ÖÎö -- Lexer

´Ê·¨·ÖÎöºÜºÃÀí½â£¬¾ÍÊǰÑÒ»¶ÎÎÒÃÇдµÄÔ´´úÂë·Ö½â³ÉTokenÐòÁеĹý³Ì£¬ÕâÒ»¹ý³ÌÒ²½Ð·Ö´Ê¡£ÔÚJSCore£¬´Ê·¨·ÖÎöÊÇÓÉLexerÀ´Íê³É£¨ÓеıàÒëÆ÷»òÕß½âÊÍÆ÷°Ñ·Ö´Ê½Ð×öScanner£©¡£

ÕâÊÇÒ»¾äºÜ¼òµ¥µÄCÓïÑÔ±í´ïʽ£º

sum = 3 + 2;

½«Æä±ê¼Ç»¯Ö®ºó¿ÉÒԵõ½Ï±íµÄÄÚÈÝ£º

Õâ¾ÍÊÇ´Ê·¨·ÖÎöÖ®ºóµÄ½á¹û£¬µ«ÊÇ´Ê·¨·ÖÎö²¢²»»á¹Ø×¢Ã¿¸öTokenÖ®¼äµÄ¹ØÏµ£¬ÊÇ·ñÆ¥Å䣬½ö½öÊǰÑËüÃÇÇø·Ö¿ªÀ´£¬µÈ´ýÓï·¨·ÖÎöÀ´°ÑÕâЩToken¡°´®ÆðÀ´¡±¡£´Ê·¨·ÖÎöº¯ÊýÒ»°ãÊÇÓÉÓï·¨·ÖÎöÆ÷£¨Parser£©À´½øÐе÷Óõġ£ÔÚJSCoreÖУ¬´Ê·¨·ÖÎöÆ÷LexerµÄ´úÂëÖ÷Òª¼¯ÖÐÔÚparser/Lexer.h¡¢Lexer.cppÖС£

Óï·¨·ÖÎö -- Parser

¸úÈËÀàÓïÑÔÒ»Ñù£¬ÎÒÃǽ²»°µÄʱºòÆäʵÊǰ´ÕÕÔ¼¶¨Ë׳ɣ¬½»Á÷ϰ¹ß°´ÕÕÒ»¶¨µÄÓï·¨½²³öÒ»¸öÓÖÒ»¸ö´ÊÓï¡£ÄÇÀà±Èµ½¼ÆËã»úÓïÑÔ£¬¼ÆËã»úÒªÀí½âÒ»ÃżÆËã»úÓïÑÔ£¬Ò²ÒªÀí½âÒ»¸öÓï¾äµÄÓï·¨¡£ÀýÈçÒÔÏÂÒ»¶ÎJSÓï¾ä£º

var sum = 2 + 3;
var a = sum + 5;

Parser»á°ÑLexer·ÖÎöÖ®ºóÉú³ÉµÄtokenÐòÁнøÐÐÓï·¨·ÖÎö£¬²¢Éú³É¶ÔÓ¦µÄÒ»¿Ã³éÏóÓï·¨Ê÷(AST)¡£Õâ¸öÊ÷³¤Ê²Ã´ÑùÄØ£¿ÔÚÕâÀïÍÆ¼öÒ»¸öÍøÕ¾£ºesprima Parser£¬ÊäÈëJSÓï¾ä¿ÉÒÔÁ¢ÂíÉú³ÉÎÒÃÇËùÐèµÄAST¡£ÀýÈ磬ÒÔÉÏÓï¾ä¾Í±»Éú³ÉÕâÑùµÄÒ»¿ÃÊ÷£º

Ö®ºó£¬ByteCodeGenerator»á¸ù¾ÝASTÀ´Éú³ÉJSCoreµÄ×Ö½ÚÂ룬Íê³ÉÕû¸öÓï·¨½âÎö²½Öè¡£

½âÊÍÖ´ÐÐ -- LLIntºÍJIT

JSÔ´´úÂë¾­¹ýÁË´Ê·¨·ÖÎöºÍÓï·¨·ÖÎöÕâÁ½¸ö²½Ö裬ת³ÉÁË×Ö½ÚÂ룬Æäʵ¾ÍÊǾ­¹ýÈκÎÒ»ÃųÌÐòÓïÑԱؾ­µÄ²½Öè--±àÒë¡£µ«ÊDz»Í¬ÓÚÎÒÃDZàÒëÔËÐÐOC´úÂ룬JS±àÒë½áÊøÖ®ºó£¬²¢²»»áÉú³É´æ·ÅÔÚÄÚ´æ»òÕßÓ²ÅÌÖ®ÖеÄÄ¿±ê´úÂë»ò¿ÉÖ´ÐÐÎļþ¡£Éú³ÉµÄÖ¸Áî×Ö½ÚÂ룬»á±»Á¢¼´±»JSCoreÕą̂ÐéÄâ»ú½øÐÐÖðÐнâÊÍÖ´ÐС£

ÔËÐÐÖ¸Áî×Ö½ÚÂ루ByteCode£©ÊÇJSÒýÇæÖкܺËÐĵIJ¿·Ö£¬¸÷¼ÒJSÒýÇæµÄÓÅ»¯Ò²Ö÷Òª¼¯ÖÐÓÚ´Ë¡£JSByteCodeµÄ½âÊÍÖ´ÐÐÊÇÒ»Ì׺ܸ´ÔÓµÄϵͳ£¬ÌرðÊǼÓÈëÁËOSRºÍ¶à¼¶JIT¼¼ÊõÖ®ºó£¬Õû¸ö½âÊÍÖ´ÐбäµÄÔ½À´Ô½¸ßЧ£¬²¢ÇÒÈÃÕû¸öByteCodeµÄÖ´ÐÐÔÚµÍÑÓʱ֮¼äºÍ¸ßÍÌÍÂÖ®¼äÓиöºÜºÃµÄƽºâ£ºÓɵÍÑÓʱµÄLLIntÀ´½âÊÍÖ´ÐÐByteCode£¬µ±Óöµ½¶à´ÎÖØ¸´µ÷ÓûòÕßÊǵݹ飬ѭ»·µÈÌõ¼þ»áͨ¹ýOSRÇл»³ÉJIT½øÐнâÊÍÖ´ÐУ¨¸ù¾Ý¾ßÌå´¥·¢Ìõ¼þ»á½øÈ벻ͬµÄJIT½øÐж¯Ì¬½âÊÍ£©À´¼Ó¿ìËÙ¶È¡£ÓÉÓÚÕⲿ·ÖÄÚÈݽÏΪ¸´ÔÓ£¬¶øÇÒ²»ÊDZ¾ÎÄÖØµã£¬¹ÊÖ»×ö¼òµ¥½éÉÜ£¬²»×öÉîÈëµÄÌÖÂÛ¡£

JSCoreÖµµÃ×¢ÒâµÄFeature

³ýÁËÒÔÉϲ¿·Ö£¬JSCore»¹Óм¸¸öÖµµÃ×¢ÒâµÄFeature¡£

»ùÓڼĴæÆ÷µÄÖ¸Á½á¹¹

JSCore²ÉÓõÄÊÇ»ùÓڼĴæÆ÷µÄÖ¸Á½á¹¹£¬Ïà±ÈÓÚ»ùÓÚÕ»µÄÖ¸Á½á¹¹£¨±ÈÈçÓÐЩJVMµÄʵÏÖ£©£¬ÒòΪ²»ÐèÒª°Ñ²Ù×÷½á¹ûƵ·±ÈëÕ»³öÕ»£¬ËùÒÔÕâÖּܹ¹µÄÖ¸ÁִÐÐЧÂʸü¸ß¡£µ«ÊÇÓÉÓÚÕâÑùµÄ¼Ü¹¹Ò²Ôì³ÉÄڴ濪Ïú¸ü´óµÄÎÊÌ⣬³ý´ËÖ®Í⣬»¹´æÔÚÒÆÖ²ÐÔÈõµÄÎÊÌ⣬ÒòΪÐéÄâ»úÖеÄÐéÄâ¼Ä´æÆ÷ÐèҪȥƥÅäµ½ÕæÊµ»úÆ÷ÖÐCPUµÄ¼Ä´æÆ÷£¬¿ÉÄÜ»á´æÔÚÕæÊµCPU¼Ä´æÆ÷²»×ãµÄÎÊÌâ¡£

»ùÓڼĴæÆ÷µÄÖ¸Á½á¹¹Í¨³£¶¼ÊÇÈýµØÖ·»òÕß¶þµØÖ·µÄÖ¸Á£¬ÀýÈ磺

i = a + b;
//ת³ÉÈýµØÖ·Ö¸Áî:
add i£¬a£¬b; //°Ña¼Ä´æÆ÷ÖеÄÖµºÍb¼Ä´æÆ÷ÖеÄÖµÏà¼Ó£¬´æÈëi¼Ä´æÆ÷

ÔÚÈýµØÖ·µÄÖ¸ÁÖеÄÔËËã¹ý³ÌÊǰÑaºÍb·Ö±ðmovµ½Á½¸ö¼Ä´æÆ÷£¬È»ºó°ÑÕâÁ½¸ö¼Ä´æÆ÷µÄÖµÇóºÍÖ®ºó£¬´æÈëµÚÈý¸ö¼Ä´æÆ÷¡£Õâ¾ÍÊÇÈýµØÖ·Ö¸ÁîÔËËã¹ý³Ì¡£

¶ø»ùÓÚÕ»µÄÒ»°ã¶¼ÊÇÁãµØÖ·Ö¸Á£¬ÒòΪËüµÄÔËËã²»ÒÀÍÐÓÚ¾ßÌåµÄ¼Ä´æÆ÷£¬¶øÊÇʹÓöԲÙ×÷ÊýÕ»ºÍ¾ßÌåÔËËã·ûÀ´Íê³ÉÕû¸öÔËËã¡£

µ¥Ï̻߳úÖÆ

ÖµµÃ×¢ÒâµÄÊÇ£¬Õû¸öJS´úÂëÊÇÖ´ÐÐÔÚÒ»ÌõÏß³ÌÀïµÄ£¬Ëü²¢²»ÏñÎÒÃÇʹÓõÄOC¡¢JavaµÈÓïÑÔ£¬ÔÚ×Ô¼ºµÄÖ´Ðл·¾³Àï¾ÍÄÜÉêÇë¶àÌõÏß³ÌÈ¥´¦ÀíһЩºÄʱÈÎÎñÀ´·ÀÖ¹×èÈûÖ÷Ï̡߳£JS´úÂë±¾Éí²¢²»´æÔÚ¶àÏ̴߳¦ÀíÈÎÎñµÄÄÜÁ¦¡£µ«ÊÇΪʲôJSÒ²´æÔÚ¶àÏß³ÌÒì²½ÄØ£¿Ç¿´óµÄʼþÇý¶¯»úÖÆ£¬ÊÇÈÃJSÒ²¿ÉÒÔ½øÐжàÏ̴߳¦ÀíµÄ¹Ø¼ü¡£

ʼþÇý¶¯»úÖÆ

֮ǰ½²µ½£¬JSµÄµ®Éú¾ÍÊÇΪÁËÈÃä¯ÀÀÆ÷Ò²ÓµÓÐһЩ½»»¥£¬Âß¼­´¦ÀíÄÜÁ¦¡£¶øJSÓëä¯ÀÀÆ÷Ö®¼äµÄ½»»¥ÊÇͨ¹ýʼþÀ´ÊµÏֵ쬱ÈÈçä¯ÀÀÆ÷¼ì²âµ½·¢ÉúÁËÓû§µã»÷£¬»á´«µÝÒ»¸öµã»÷ʼþ֪ͨJSÏß³ÌÈ¥´¦ÀíÕâ¸öʼþ¡£

ÄÇͨ¹ýÕâÒ»ÌØÐÔ£¬ÎÒÃÇ¿ÉÒÔÈÃJSÒ²½øÐÐÒì²½±à³Ì£¬¼òµ¥À´½²¾ÍÊÇÓöµ½ºÄʱÈÎÎñʱ£¬JS¿ÉÒÔ°ÑÕâ¸öÈÎÎñ¶ª¸øÒ»¸öÓÉJSËÞÖ÷ÌṩµÄ¹¤×÷Ị̈߳¨WebWorker£©È¥´¦Àí¡£µÈ¹¤×÷Ï̴߳¦ÀíÍêÖ®ºó£¬»á·¢ËÍÒ»¸ömessageÈÃJSÏß³ÌÖªµÀÕâ¸öÈÎÎñÒѾ­±»Ö´ÐÐÍêÁË£¬²¢ÔÚJSÏß³ÌÉÏÈ¥Ö´ÐÐÏàÓ¦µÄʼþ´¦Àí³ÌÐò¡££¨µ«ÊÇÐèҪעÒ⣬ÓÉÓÚ¹¤×÷Ï̺߳ÍJSÏ̲߳¢²»ÔÚÒ»¸öÔËÐл·¾³£¬ËùÒÔËüÃDz¢²»¹²ÏíÒ»¸ö×÷ÓÃÓò£¬¹Ê¹¤×÷Ïß³ÌÒ²²»ÄܲÙ×÷windowºÍDOM¡££©

JSÏ̺߳͹¤×÷Ị̈߳¬ÒÔ¼°ä¯ÀÀÆ÷ʼþÖ®¼äµÄͨÐÅ»úÖÆ½Ð×öʼþÑ­»·£¨EventLoop£©£¬ÀàËÆÓÚiOSµÄrunloop¡£ËüÓÐÁ½¸ö¸ÅÄһ¸öÊÇCall Stack£¬Ò»¸öÊÇTask Queue¡£µ±¹¤×÷Ïß³ÌÍê³ÉÒì²½ÈÎÎñÖ®ºó£¬»á°ÑÏûÏ¢ÍÆµ½Task Queue£¬ÏûÏ¢¾ÍÊÇ×¢²áʱµÄ»Øµ÷º¯Êý¡£µ±Call StackΪ¿ÕµÄʱºò£¬Ö÷Ï̻߳á´ÓTask QueueÀïȡһÌõÏûÏ¢·ÅÈëCall StackÀ´Ö´ÐУ¬JSÖ÷Ï̻߳áÒ»Ö±ÖØ¸´Õâ¸ö¶¯×÷Ö±µ½ÏûÏ¢¶ÓÁÐΪ¿Õ¡£

ÒÔÉÏÕâÕÅͼ´ó¸ÅÃèÊöÁËJSCoreµÄʼþÇý¶¯»úÖÆ£¬Õû¸öJS³ÌÐòÆäʵ¾ÍÊÇÕâÑùÅÜÆðÀ´µÄ¡£Õâ¸öÆäʵ¸ú¿ÕÏÐ״̬ϵÄiOS RunloopÓеãÏñ£¬µ±»ùÓÚPortµÄSourceʼþ»½ÐÑrunloopÖ®ºó£¬»áÈ¥´¦Àíµ±Ç°¶ÓÁÐÀïµÄËùÓÐsourceʼþ¡£JSµÄʼþÇý¶¯£¬¸úÏûÏ¢¶ÓÁÐÆäʵÊÇ¡°ÒìÇúͬ¹¤¡±¡£Ò²ÕýÒòΪ¹¤×÷Ï̺߳ÍʼþÇý¶¯»úÖÆµÄ´æÔÚ£¬²ÅÈÃJSÓÐÁ˶àÏß³ÌÒì²½ÄÜÁ¦¡£

iOSÖеÄJSCore

iOS7Ö®ºó£¬Æ»¹û¶ÔWebKitÖеÄJSCore½øÐÐÁËObjective-CµÄ·â×°£¬²¢Ìṩ¸øËùÓеÄiOS¿ª·¢Õß¡£JSCore¿ò¼Ü¸øSwift¡¢OCÒÔ¼°CÓïÑÔ±àдµÄAppÌṩÁ˵÷ÓÃJS³ÌÐòµÄÄÜÁ¦¡£Í¬Ê±ÎÒÃÇÒ²¿ÉÒÔʹÓÃJSCoreÍùJS»·¾³ÖÐÈ¥²åÈëһЩ×Ô¶¨Òå¶ÔÏó¡£

iOSÖпÉÒÔʹÓÃJSCoreµÄµØ·½Óжദ£¬±ÈÈç·â×°ÔÚUIWebViewÖеÄJSCore£¬·â×°ÔÚWKWebViewÖеÄJSCore£¬ÒÔ¼°ÏµÍ³ÌṩµÄJSCore¡£Êµ¼ÊÉÏ£¬¼´Ê¹Í¬ÎªJSCore£¬ËüÃÇÖ®¼äÒ²´æÔںܶàÇø±ð¡£ÒòÎªËæ×ÅJSÕâÃÅÓïÑԵķ¢Õ¹£¬JSµÄËÞÖ÷Ô½À´Ô½¶à£¬Óи÷ÖÖ¸÷ÑùµÄä¯ÀÀÆ÷£¬ÉõÖÁÊdz£¼ûÓÚ·þÎñ¶ËµÄNode.js£¨»ùÓÚV8ÔËÐУ©¡£ËæÊ±Ê¹Óó¡¾°µÄ²»Í¬£¬ÒÔ¼°WebKitÍŶÓ×ÔÉí²»Í£µÄÓÅ»¯£¬JSCoreÖð½¥·Ö»¯³ö²»Í¬µÄ°æ±¾¡£³ýÁËÀϰ汾µÄJSCore£¬»¹ÓÐ2008ÄêÐû²¼µÄÔËÐÐÔÚSafari¡¢WKWebViewÖеÄNitro£¨SquirrelFish£©µÈµÈ¡£¶øÔÚ±¾ÎÄÖУ¬ÎÒÃÇÖ÷Òª½éÉÜiOSϵͳ×Ô´øµÄJSCore Framework¡£

iOS¹Ù·½Îĵµ¶ÔJSCoreµÄ½éÉܼܺòµ¥£¬ÆäʵÖ÷Òª¾ÍÊǸøAppÌṩÁ˵÷ÓÃJS½Å±¾µÄÄÜÁ¦¡£ÎÒÃÇÊ×ÏÈͨ¹ýJSCore FrameworkµÄ15¸ö¿ª·ÅÍ·ÎļþÀ´¡°¹ÜÖпú±ª¡±£¬ÈçÏÂͼËùʾ£º

Õ§Ò»¿´£¬¸ÅÄîºÜ¶à¡£µ«ÊdzýȥһЩ¹«¹²Í·ÎļþÒÔ¼°Ò»Ð©ºÜϸ½ÚµÄ¸ÅÄÆäÊµÕæÕý³£ÓõIJ¢²»¶à£¬±ÊÕßÈÏΪºÜÓбØÒªÁ˽âµÄ¸ÅÄîÖ»ÓÐ4¸ö£ºJSVM£¬JSContext£¬JSValue£¬JSExport¡£¼øÓÚ½²ÊöÕâЩ¸ÅÄîµÄÎÄÕÂÒѾ­Óкܶ࣬±¾Îľ¡Á¿´ÓһЩ²»Í¬µÄ½Ç¶È£¨±ÈÈçÔ­Àí£¬ÑÓÉì¶Ô±ÈµÈ£©È¥½âÊÍÕâЩ¸ÅÄî¡£

JSVirtualMachine

Ò»¸öJSVirtualMachine£¨ÒÔϼò³ÆJSVM£©ÊµÀý´ú±íÁËÒ»¸ö×Ô°üº¬µÄJSÔËÐл·¾³£¬»òÕßÊÇһϵÁÐJSÔËÐÐËùÐèµÄ×ÊÔ´¡£¸ÃÀàÓÐÁ½¸öÖ÷ÒªµÄʹÓÃÓÃ;£ºÒ»ÊÇÖ§³Ö²¢·¢µÄJSµ÷Ó㬶þÊǹÜÀíJSºÍNativeÖ®¼äÇŶÔÏóµÄÄÚ´æ¡£

JSVMÊÇÎÒÃÇҪѧϰµÄµÚÒ»¸ö¸ÅÄî¡£¹Ù·½½éÉÜJSVMΪJavaScriptµÄÖ´ÐÐÌṩµ×²ã×ÊÔ´£¬¶ø´ÓÀàÃûÖ±Òë¹ýÀ´£¬Ò»¸öJSVM¾Í´ú±íÒ»¸öJSÐéÄâ»ú£¬ÎÒÃÇÔÚÉÏÃæÒ²Ìáµ½ÁËÐéÄâ»úµÄ¸ÅÄÄÇÎÒÃÇÏÈÌÖÂÛÒ»ÏÂʲôÊÇÐéÄâ»ú¡£Ê×ÏÈÎÒÃÇ¿ÉÒÔ¿´¿´£¨¿ÉÄÜÊÇ£©×î³öÃûµÄÐéÄâ»ú¡ª¡ªJVM£¨JavaÐéÄâ»ú£©¡£

JVMÖ÷Òª×öÁ½¸öÊÂÇ飺

Ê×ÏÈËüÒª×öµÄÊǰÑJavaC±àÒëÆ÷Éú³ÉµÄByteCode£¨ByteCodeÆäʵ¾ÍÊÇJVMµÄÐéÄâ»úÆ÷Ö¸ÁÉú³Éÿ̨»úÆ÷ËùÐèÒªµÄ»úÆ÷Ö¸ÁÈÃJava³ÌÐò¿ÉÖ´ÐУ¨ÈçÏÂͼ£©¡£

µÚ¶þ²½£¬JVM¸ºÔðÕû¸öJava³ÌÐòÔËÐÐʱËùÐèÒªµÄÄÚ´æ¿Õ¼ä¹ÜÀí¡¢GCÒÔ¼°Java³ÌÐòÓëNative£¨¼´C,C++£©Ö®¼äµÄ½Ó¿ÚµÈµÈ¡£

´Ó¹¦ÄÜÉÏÀ´¿´£¬Ò»¸ö¸ß¼¶ÓïÑÔÐéÄâ»úÖ÷Òª·ÖΪÁ½²¿·Ö£¬Ò»¸öÊǽâÊÍÆ÷²¿·Ö£¬ÓÃÀ´ÔËÐи߼¶ÓïÑÔ±àÒëÉú³ÉµÄByteCode£¬»¹ÓÐÒ»²¿·ÖÔòÊÇRuntimeÔËÐÐʱ£¬ÓÃÀ´¸ºÔðÔËÐÐʱµÄÄÚ´æ¿Õ¼ä¿ª±Ù¡¢¹ÜÀíµÈµÈ¡£Êµ¼ÊÉÏ£¬JSCore³£³£±»ÈÏΪÊÇÒ»¸öJSÓïÑÔµÄÓÅ»¯ÐéÄâ»ú£¬Ëü×ö×ÅJVMÀàËÆµÄÊÂÇ飬ֻÊÇÏà±È¾²Ì¬±àÒëµÄJava£¬Ëü»¹¶à³Ðµ£Á˰ÑJSÔ´´úÂë±àÒë³É×Ö½ÚÂëµÄ¹¤×÷¡£

¼ÈÈ»JSCore±»ÈÏΪÊÇÒ»¸öÐéÄâ»ú£¬ÄÇJSVMÓÖÊÇʲô£¿Êµ¼ÊÉÏ£¬JSVM¾ÍÊÇÒ»¸ö³éÏóµÄJSÐéÄâ»ú£¬Èÿª·¢Õß¿ÉÒÔÖ±½Ó²Ù×÷¡£ÔÚAppÖУ¬ÎÒÃÇ¿ÉÒÔÔËÐжà¸öJSVMÀ´Ö´Ðв»Í¬µÄÈÎÎñ¡£¶øÇÒÿһ¸öJSContext£¨Ï½ڽéÉÜ£©¶¼´ÓÊôÓÚÒ»¸öJSVM¡£µ«ÊÇÐèҪעÒâµÄÊÇÿ¸öJSVM¶¼ÓÐ×Ô¼º¶ÀÁ¢µÄ¶Ñ¿Õ¼ä£¬GCÒ²Ö»ÄÜ´¦ÀíJSVMÄÚ²¿µÄ¶ÔÏó£¨ÔÚϽڻá¼òµ¥½²½âJSµÄGC»úÖÆ£©¡£ËùÒÔ˵£¬²»Í¬µÄJSVMÖ®¼äÊÇÎÞ·¨´«µÝÖµµÄ¡£

ÖµµÃ×¢ÒâµÄ»¹ÓУ¬ÔÚÉÏÃæµÄÕ½ÚÖУ¬ÎÒÃÇÌáµ½µÄJSµ¥Ï̻߳úÖÆ¡£ÕâÒâζ×Å£¬ÔÚÒ»¸öJSVMÖУ¬Ö»ÓÐÒ»ÌõÏ߳̿ÉÒÔÅÜJS´úÂ룬ËùÒÔÎÒÃÇÎÞ·¨Ê¹ÓÃJSVM½øÐжàÏ̴߳¦ÀíJSÈÎÎñ¡£Èç¹ûÎÒÃÇÐèÒª¶àÏ̴߳¦ÀíJSÈÎÎñµÄ³¡¾°£¬¾ÍÐèҪͬʱÉú³É¶à¸öJSVM£¬´Ó¶ø´ïµ½¶àÏ̴߳¦ÀíµÄÄ¿µÄ¡£

JSµÄGC»úÖÆ

JSͬÑùÒ²²»ÐèÒªÎÒÃÇÈ¥ÊÖ¶¯¹ÜÀíÄÚ´æ¡£JSµÄÄÚ´æ¹ÜÀíʹÓõÄÊÇGC»úÖÆ£¨Tracing Garbage Collection£©¡£²»Í¬ÓÚOCµÄÒýÓüÆÊý£¬Tracing Garbage CollectionÊÇÓÉGCRoot£¨Context£©¿ªÊ¼Î¬»¤µÄÒ»ÌõÒýÓÃÁ´£¬Ò»µ©ÒýÓÃÁ´ÎÞ·¨´¥´ïij¶ÔÏó½Úµã£¬Õâ¸ö¶ÔÏó¾Í»á±»»ØÊÕµô¡£ÈçÏÂͼËùʾ£º

JSContext

Ò»¸öJSContext±íʾÁËÒ»´ÎJSµÄÖ´Ðл·¾³¡£ÎÒÃÇ¿ÉÒÔͨ¹ý´´½¨Ò»¸öJSContextÈ¥µ÷ÓÃJS½Å±¾£¬·ÃÎÊһЩJS¶¨ÒåµÄÖµºÍº¯Êý£¬Í¬Ê±Ò²ÌṩÁËÈÃJS·ÃÎÊNative¶ÔÏ󣬷½·¨µÄ½Ó¿Ú¡£

JSContextÊÇÎÒÃÇÔÚʵ¼ÊʹÓÃJSCoreʱ£¬¾­³£Óõ½µÄ¸ÅÄîÖ®Ò»¡£"Context"Õâ¸ö¸ÅÄîÎÒÃǶ¼»ò¶à»òÉÙµÄÔÚÆäËü¿ª·¢³¡¾°Öмû¹ý£¬Ëü×î³£±»·­Òë³É¡°ÉÏÏÂÎÄ¡±¡£ÄÇʲôÊÇÉÏÏÂÎÄ£¿±ÈÈçÔÚһƪÎÄÕÂÖУ¬ÎÒÃÇ¿´µ½Ò»¾ä»°£º¡°Ëû·É¿ìµÄÅÜÁ˳öÈ¥¡£¡±µ«ÊÇÈç¹ûÎÒÃDz»¿´ÉÏÏÂÎĵϰ£¬ÎÒÃDz¢²»ÖªµÀÕâ¾ä»°¾¿¾¹ÊÇʲôÒâ˼£ºË­ÅÜÁ˳öÈ¥£¿ËûÊÇË­£¿ËûΪʲôҪÅÜ£¿

д¼ÆËã»úÀí½âµÄ³ÌÐòÓïÑÔ¸úдÎÄÕÂÊÇÏàËÆµÄ£¬ÎÒÃÇÔËÐÐÈκÎÒ»¶ÎÓï¾ä¶¼ÐèÒªÓÐÕâÑùÒ»¸ö¡°ÉÏÏÂÎÄ¡±µÄ´æÔÚ¡£±ÈÈç֮ǰÍⲿ±äÁ¿µÄÒýÈ롢ȫ¾Ö±äÁ¿¡¢º¯ÊýµÄ¶¨Òå¡¢ÒѾ­·ÖÅäµÄ×ÊÔ´µÈµÈ¡£ÓÐÁËÕâЩÐÅÏ¢£¬ÎÒÃDzÅÄÜ׼ȷµÄÖ´ÐÐÿһ¾ä´úÂë¡£

ͬÀí£¬JSContext¾ÍÊÇJSÓïÑÔµÄÖ´Ðл·¾³£¬ËùÓÐJS´úÂëµÄÖ´ÐбØÐëÔÚÒ»¸öJSContextÖ®ÖУ¬ÔÚWebViewÖÐÒ²ÊÇÒ»Ñù£¬ÎÒÃÇ¿ÉÒÔͨ¹ýKVCµÄ·½Ê½»ñÈ¡µ±Ê±WebViewµÄJSContext¡£Í¨¹ýJSContextÔËÐÐÒ»¶ÎJS´úÂëÊ®·Ö¼òµ¥£¬ÈçÏÂÃæÕâ¸öÀý×Ó£º

JSContext *context = [[JSContext alloc] init];
[context evaluateScript:@"var a = 1;var b = 2;"];
NSInteger sum = [[context evaluateScript:@"a + b"] toInt32];//sum=3

½èÖúevaluateScript API£¬ÎÒÃǾͿÉÒÔÔÚOCÖдîÅäJSContextÖ´ÐÐJS´úÂë¡£ËüµÄ·µ»ØÖµÊÇJSÖÐ×îºóÉú³ÉµÄÒ»¸öÖµ£¬ÓÃÊôÓÚµ±Ç°JSContextÖеÄJSValue£¨ÏÂÒ»½Ú»áÓнéÉÜ£©°ü¹ü·µ»Ø¡£

ÎÒÃÇ»¹¿ÉÒÔͨ¹ýKVCµÄ·½Ê½£¬¸øJSContextÈû½øÈ¥ºÜ¶àÈ«¾Ö¶ÔÏó»òÕßÈ«¾Öº¯Êý£º

JSContext *context = [[JSContext alloc] init];
context[@"globalFunc"] = ^() {
NSArray *args = [JSContext currentArguments];
for (id obj in args) {
NSLog(@"Äõ½Á˲ÎÊý:%@", obj);
}
};
context[@"globalProp"] = @"È«¾Ö±äÁ¿×Ö·û´®";
[context evaluateScript:@"globalFunc(globalProp)"];//consoleÊä³ö£º¡°Äõ½Á˲ÎÊý:È«¾Ö±äÁ¿×Ö·û´®¡±

ÕâÊÇÒ»¸öºÜºÃÓöøÇÒºÜÖØÒªµÄÌØÐÔ£¬ÓкܶàÖøÃûµÄ½èÖúJSCoreµÄ¿ò¼ÜÈçJSPatch£¬¶¼ÀûÓÃÁËÕâ¸öÌØÐÔȥʵÏÖһЩºÜÇÉÃîµÄÊÂÇé¡£ÔÚÕâÀïÎÒÃDz»¹ý¶à̽ÌÖ¿ÉÒÔÀûÓÃËü×öʲô£¬¶øÊÇÈ¥Ñо¿Ëü¾¿¾¹ÊÇÔõÑùÔË×÷µÄ¡£ÔÚJSContextµÄAPIÖУ¬ÓÐÒ»¸öÖµµÃ×¢ÒâµÄÖ»¶ÁÊôÐÔ -- JSValueÀàÐ͵ÄglobalObject¡£Ëü·µ»Øµ±Ç°Ö´ÐÐJSContextµÄÈ«¾Ö¶ÔÏó£¬ÀýÈçÔÚWebKitÖУ¬JSContext¾Í»á·µ»Øµ±Ç°µÄWindow¶ÔÏó¡£¶øÕâ¸öÈ«¾Ö¶ÔÏóÆäʵҲÊÇJSContext×îºËÐĵĶ«Î÷£¬µ±ÎÒÃÇͨ¹ýKVC·½Ê½ÓëJSContext½øÈ¥È¡Öµ¸³ÖµµÄʱºò£¬Êµ¼ÊÉ϶¼ÊÇÔÚ¸úÕâ¸öÈ«¾Ö¶ÔÏó×ö½»»¥£¬¼¸ºõËùÓеĶ«Î÷¶¼ÔÚÈ«¾Ö¶ÔÏóÀ¿ÉÒÔ˵£¬JSContextÖ»ÊÇglobalObjectµÄÒ»²ã¿Ç¡£¶ÔÓÚÉÏÊöÁ½¸öÀý×Ó£¬±¾ÎÄÈ¡ÁËcontextµÄglobalObject£¬²¢×ª³ÉÁËOC¶ÔÏó£¬ÈçÏÂͼ£º

¿ÉÒÔ¿´µ½Õâ¸öglobalObject±£´æÁËËùÓеıäÁ¿Ó뺯Êý£¬Õâ¸ü¼ÓÓ¡Ö¤ÁËÉÏÎĵÄ˵·¨£¨ÖÁÓÚΪʲôglobalObject¶ÔÓ¦OC¶ÔÏóÊÇNSDictionaryÀàÐÍ£¬ÎÒÃǽ«ÔÚϽÚÖн²Êö£©¡£ËùÒÔÎÒÃÇ»¹ÄܵóöÁíÍâÒ»¸ö½áÂÛ£¬JSÖÐËùνµÄÈ«¾Ö±äÁ¿£¬È«¾Öº¯Êý²»¹ýÊÇÈ«¾Ö¶ÔÏóµÄÊôÐԺͺ¯Êý¡£

ͬʱֵµÃ×¢ÒâµÄÊÇ£¬Ã¿¸öJSContext¶¼´ÓÊôÓÚÒ»¸öJSVM¡£ÎÒÃÇ¿ÉÒÔͨ¹ýJSContextµÄÖ»¶ÁÊôÐÔ -- virtualMachine»ñµÃµ±Ç°JSContext°ó¶¨µÄJSVM¡£JSContextºÍJSVMÊǶà¶ÔÒ»µÄ¹ØÏµ£¬Ò»¸öJSContextÖ»Äܰó¶¨Ò»¸öJSVM£¬µ«ÊÇÒ»¸öJSVM¿ÉÒÔͬʱ³ÖÓжà¸öJSContext¡£¶øÉÏÎÄÖÐÎÒÃÇÌáµ½£¬Ã¿¸öJSVMͬʱֻÓÐÕû¸öÒ»¸öÏß³ÌÀ´Ö´ÐÐJS´úÂ룬ËùÒÔ×ÛºÏÀ´¿´£¬Ò»´Î¼òµ¥µÄͨ¹ýJSCoreÔËÐÐJS´úÂ룬²¢ÔÚNative²ã»ñÈ¡·µ»ØÖµµÄ¹ý³Ì´óÖÂÈçÏ£º

JSValue

JSValueʵÀýÊÇÒ»¸öÖ¸ÏòJSÖµµÄÒýÓÃÖ¸Õë¡£ÎÒÃÇ¿ÉÒÔʹÓÃJSValueÀ࣬ÔÚOCºÍJSµÄ»ù´¡Êý¾ÝÀàÐÍÖ®¼äÏ໥ת»»¡£Í¬Ê±ÎÒÃÇÒ²¿ÉÒÔʹÓÃÕâ¸öÀ࣬ȥ´´½¨°ü×°ÁËNative×Ô¶¨ÒåÀàµÄJS¶ÔÏ󣬻òÕßÊÇÄÇЩÓÉNative·½·¨»òÕßBlockÌṩʵÏÖJS·½·¨µÄJS¶ÔÏó¡£

ÔÚJSContextÒ»½ÚÖУ¬ÎÒÃǽӴ¥ÁË´óÁ¿µÄJSValueÀàÐ͵ıäÁ¿¡£ÔÚJSContextÒ»½ÚÖÐÎÒÃÇÁ˽⵽£¬ÎÒÃÇ¿ÉÒԺܼòµ¥µÄͨ¹ýKVC²Ù×÷JSÈ«¾Ö¶ÔÏó£¬Ò²¿ÉÒÔÖ±½Ó»ñµÃJS´úÂëÖ´Ðнá¹ûµÄ·µ»ØÖµ£¨Í¬Ê±Ã¿Ò»¸öJSÖеÄÖµ¶¼´æÔÚÓÚÒ»¸öÖ´Ðл·¾³Ö®ÖУ¬Ò²¾ÍÊÇ˵ÿ¸öJSValue¶¼´æÔÚÓÚÒ»¸öJSContextÖ®ÖУ¬ÕâÒ²¾ÍÊÇJSValueµÄ×÷ÓÃÓò£©£¬¶¼ÊÇÒòΪJSCore°ïÎÒÃÇÓÃJSValueÔڵײã×Ô¶¯×öÁËOCºÍJSµÄÀàÐÍת»»¡£

JSCoreÒ»¹²ÌṩÁËÈçÏÂ10ÖÖÀàÐÍ»¥»»£º

Objective-C type | JavaScript type
--------------------+---------------------
nil | undefined
NSNull | null
NSString | string
NSNumber | number, boolean
NSDictionary | Object object
NSArray | Array object
NSDate | Date object
NSBlock | Function object
id | Wrapper object
Class | Constructor object

ͬʱ»¹ÌṩÁ˶ÔÓ¦µÄ»¥»»API£¨½ÚÑ¡£©£º

+ (JSValue *)valueWithDouble:(double)value inContext:(JSContext *)context;
+ (JSValue *)valueWithInt32:(int32_t)value inContext:(JSContext *)context;
- (NSArray *)toArray;
- (NSDictionary *)toDictionary;

ÔÚ½²ÀàÐÍת»»Ç°£¬ÎÒÃÇÏÈÁ˽âÒ»ÏÂJSÕâÃÅÓïÑԵıäÁ¿ÀàÐÍ¡£¸ù¾ÝECMAScript£¨¿ÉÒÔÀí½âΪJSµÄ±ê×¼£©µÄ¶¨Ò壺JSÖдæÔÚÁ½ÖÖÊý¾ÝÀàÐ͵ÄÖµ£¬Ò»ÖÖÊÇ»ù±¾ÀàÐÍÖµ£¬ËüÖ¸µÄÊǼòµ¥µÄÊý¾Ý¶Î¡£µÚ¶þÖÖÊÇÒýÓÃÀàÐÍÖµ£¬Ö¸ÄÇЩ¿ÉÄÜÓɶà¸öÖµ¹¹³ÉµÄ¶ÔÏó¡£»ù±¾ÀàÐÍÖµ°üÀ¨"undefined"£¬"nul"£¬"Boolean"£¬"Number"£¬"String"£¨Êǵģ¬StringÒ²ÊÇ»ù´¡ÀàÐÍ£©£¬³ý´ËÖ®Íâ¶¼ÊÇÒýÓÃÀàÐÍ¡£¶ÔÓÚǰÎåÖÖ»ù´¡ÀàÐ͵Ļ¥»»£¬Ó¦¸ÃûÓÐÌ«¶àÒª½²µÄ¡£½ÓÏÂÀ´»áÖØµã½²½²ÒýÓÃÀàÐ͵Ļ¥»»£º

NSDictionary <--> Object

ÔÚÉϽÚÖУ¬ÎÒÃǰÑJSContextµÄglobalObjectת»»³ÉOC¶ÔÏ󣬷¢ÏÖÊÇNSDictionaryÀàÐÍ¡£Òª¸ãÇå³þÕâ¸öת»»£¬Ê×ÏÈÎÒÃǶÔJSÕâÃÅÓïÑÔÃæÏò¶ÔÏóµÄÌØÐÔ½øÐÐÒ»¸ö¼òµ¥µÄÁ˽⡣ÔÚJSÖУ¬¶ÔÏó¾ÍÊÇÒ»¸öÒýÓÃÀàÐ͵ÄʵÀý¡£ÓëÎÒÃÇÊìϤµÄOC¡¢Java²»Ò»Ñù£¬¶ÔÏó²¢²»ÊÇÒ»¸öÀàµÄʵÀý£¬ÒòΪÔÚJSÖв¢²»´æÔÚÀàµÄ¸ÅÄî¡£ECMA°Ñ¶ÔÏó¶¨ÒåΪ£ºÎÞÐòÊôÐԵļ¯ºÏ£¬ÆäÊôÐÔ¿ÉÒÔ°üº¬»ù±¾Öµ¡¢¶ÔÏó»òÕߺ¯Êý¡£´ÓÕâ¸ö¶¨ÒåÎÒÃÇ¿ÉÒÔ·¢ÏÖ£¬JSÖеĶÔÏó¾ÍÊÇÎÞÐòµÄ¼üÖµ¶Ô£¬ÕâºÍOCÖеÄNSDictionary£¬JavaÖеÄHashMapºÎÆäÏàËÆ¡£

var person = { name: "Nicholas",age: 17};//JSÖеÄperson¶ÔÏó
NSDictionary *person = @{@"name":@"Nicholas",@"age":@17};//OCÖеÄperson dictionary

ÔÚÉÏÃæµÄʵÀý´úÂëÖУ¬±ÊÕßʹÓÃÁËÀàËÆµÄ·½Ê½´´½¨ÁËJSÖеĶÔÏó£¨ÔÚJSÖнС°¶ÔÏó×ÖÃæÁ¿¡±±íʾ·¨£©ÓëOCÖеÄNSDictionary£¬ÏàÐÅ¿ÉÒÔ¸üÓÐÖúÀí½âÕâÁ½¸öת»»¡£

NSBlock <--> Function Object

ÔÚÉϽڵÄÀý×ÓÖУ¬±ÊÕßÔÚJSContext¸³ÖµÁËÒ»¸ö"globalFunc"µÄBlock£¬²¢¿ÉÒÔÔÚJS´úÂëÖе±³ÉÒ»¸öº¯ÊýÖ±½Óµ÷Óá£ÎÒ»¹¿ÉÒÔʹÓÃ"typeof"¹Ø¼ü×ÖÀ´ÅжÏglobalFuncÔÚJSÖеÄÀàÐÍ£º

NSString *type = [[context evaluateScript:@"typeof globalFunc"] toString];//typeµÄֵΪ"function"

ͨ¹ýÕâ¸öÀý×Ó£¬ÎÒÃÇÒ²ÄÜ·¢ÏÖ´«ÈëµÄBlock¶ÔÏóÔÚJSÖÐÒѾ­±»×ª³ÉÁË"function"ÀàÐÍ¡£"Function Object"Õâ¸ö¸ÅÄî¶ÔÓÚÎÒÃÇд¹ß´«Í³ÃæÏò¶ÔÏóÓïÑԵĿª·¢ÕßÀ´Ëµ£¬¿ÉÄÜ»á±È½Ï»Þɬ¡£¶øÊµ¼ÊÉÏ£¬JSÕâÃÅÓïÑÔ£¬³ýÁË»ù±¾ÀàÐÍÒÔÍ⣬¾ÍÊÇÒýÓÃÀàÐÍ¡£º¯Êýʵ¼ÊÉÏÒ²ÊÇÒ»¸ö"Function"ÀàÐ͵ĶÔÏó£¬Ã¿¸öº¯ÊýÃûʵÔòÊÇÖ¸ÏòÒ»¸öº¯Êý¶ÔÏóµÄÒýÓᣱÈÈçÎÒÃÇ¿ÉÒÔÕâÑùÔÚJSÖж¨ÒåÒ»¸öº¯Êý£º

var sum = function(num1,num2){
return num1 + num2;
}

ͬʱÎÒÃÇ»¹¿ÉÒÔÕâÑù¶¨ÒåÒ»¸öº¯Êý£¨²»ÍƼö£©:

var sum = new Function("num1","num2","return num1 + num2");

°´ÕÕµÚ¶þÖÖд·¨£¬ÎÒÃǾÍÄܺÜÖ±¹ÛµÄÀí½âµ½º¯ÊýÒ²ÊǶÔÏó£¬ËüµÄ¹¹Ô캯Êý¾ÍÊÇFunction£¬º¯ÊýÃûÖ»ÊÇÖ¸ÏòÕâ¸ö¶ÔÏóµÄÖ¸Õë¡£¶øNSBlockÊÇÒ»¸ö°ü¹üÁ˺¯ÊýÖ¸ÕëµÄÀ࣬JSCore°ÑFunction Objectת³ÉNSBlock¶ÔÏ󣬿ÉÒÔ˵ÊǺܺÏÊʵġ£

JSExport

ʵÏÖJSExportЭÒé¿ÉÒÔ¿ª·ÅOCÀàºÍËüÃǵÄʵÀý·½·¨£¬Àà·½·¨£¬ÒÔ¼°ÊôÐÔ¸øJSµ÷Óá£

³ýÁËÉÏÒ»½ÚÌáµ½µÄ¼¸ÖÖÌØÊâÀàÐ͵Äת»»£¬ÎÒÃÇ»¹Ê£ÏÂNSDateÀàÐÍ£¬Óëid¡¢classÀàÐ͵Äת»»ÐèҪŪÇå³þ¡£¶øNSDateÀàÐÍÎÞÐè׸Êö£¬ËùÒÔÎÒÃÇÔÚÕâÒ»½ÚÖØµãҪŪÇå³þºóÁ½ÕßµÄת»»¡£

¶øÍ¨³£Çé¿öÏ£¬ÎÒÃÇÈç¹ûÏëÔÚJS»·¾³ÖÐʹÓÃOCÖеÄÀàºÍ¶ÔÏó£¬ÐèÒªËüÃÇʵÏÖJSExportЭÒ飬À´È·¶¨±©Â¶¸øJS»·¾³ÖеÄÊôÐԺͷ½·¨¡£±ÈÈçÎÒÃÇÐèÒªÏòJS»·¾³Öб©Â¶Ò»¸öPersonµÄÀàÓë»ñÈ¡Ãû×ֵķ½·¨£º

@protocol PersonProtocol <JSExport>
- (NSString *)fullName;//fullNameÓÃÀ´Æ´½ÓfirstNameºÍlastName£¬²¢·µ»ØÈ«Ãû
@end

@interface JSExportPerson : NSObject <PersonProtocol>

- (NSString *)sayFullName;//sayFullName·½·¨

@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;

@end

È»ºó£¬ÎÒÃÇ¿ÉÒÔ°ÑÒ»¸öJSExportPersonµÄÒ»¸öʵÀý´«ÈëJSContext£¬²¢ÇÒ¿ÉÒÔÖ±½ÓÖ´ÐÐfullName·½·¨£º

JSExportPerson *person = [[JSExportPerson alloc] init];
context[@"person"] = person;
person.firstName = @"Di";
person.lastName =@"Tang";
[context evaluateScript:@"log(person.fullName())"];//µ÷Native·½·¨£¬´òÓ¡³öpersonʵÀýµÄÈ«Ãû
[context evaluateScript:@"person.sayFullName())"];//ÌáʾTypeError£¬'person.sayFullName' is undefined

Õâ¾ÍÊÇÒ»¸öºÜ¼òµ¥µÄʹÓÃJSExportµÄÀý×Ó£¬µ«Çë×¢Ò⣬ÎÒÃÇÖ»Äܵ÷ÓÃÔڸöÔÏóÔÚJSExportÖпª·Å³öÈ¥µÄ·½·¨£¬Èç¹û²¢Î´¿ª·Å³öÈ¥£¬ÈçÉÏÀýÖеÄ"sayFullName"·½·¨£¬Ö±½Óµ÷ÓÃÔò»á±¨TypeError´íÎó£¬ÒòΪ¸Ã·½·¨ÔÚJS»·¾³Öв¢Î´±»¶¨Òå¡£

½²ÍêJSExportµÄ¾ßÌåʹÓ÷½·¨£¬ÎÒÃÇÀ´¿´¿´ÎÒÃÇ×ʼµÄÎÊÌâ¡£µ±Ò»¸öOC¶ÔÏó´«ÈëJS»·¾³Ö®ºó£¬»áת³ÉÒ»¸öJSWrapperObject¡£ÄÇÎÊÌâÀ´ÁË£¬Ê²Ã´ÊÇJSWrapperObject£¿ÔÚJSCoreµÄÔ´ÂëÖУ¬ÎÒÃÇ¿ÉÒÔÕÒµ½Ò»Ð©ÏßË÷¡£Ê×ÏÈÔÚJSCoreµÄJSValueÖУ¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖÕâÑùÒ»¸ö·½·¨:

@method
@abstract Create a JSValue by converting an Objective-C object.
@discussion The resulting JSValue retains the provided Objective-C object.
@param value The Objective-C object to be converted.
@result The new JSValue.
*/
+ (JSValue *)valueWithObject:(id)value inContext:(JSContext *)context;

Õâ¸öAPI¿ÉÒÔ´«ÈëÈÎÒâÒ»¸öÀàÐ͵ÄOC¶ÔÏó£¬È»ºó·µ»ØÒ»¸ö³ÖÓиÃOC¶ÔÏóµÄJSValue¡£ÄÇÕâ¸ö¹ý³Ì¿Ï¶¨Éæ¼°µ½OC¶ÔÏóµ½JS¶ÔÏóµÄ»¥»»£¬ËùÒÔÎÒÃÇÖ»Òª·ÖÎöÒ»ÏÂÕâ¸ö·½·¨µÄÔ´Â루»ùÓÚÕâ¸ö·ÖÖ§½øÐзÖÎö£©¡£ÓÉÓÚÔ´ÂëʵÏÖ¹ý³¤£¬ÎÒÃÇÖ»ÐèÒª¹Ø×¢ºËÐÄ´úÂ룬ÔÚJSContextÖÐÓÐÒ»¸ö"wrapperForObjCObject"·½·¨£¬¶øÊµ¼ÊÉÏËüÓÖÊǵ÷ÓÃÁËJSWrapperMapµÄ"jsWrapperForObject"·½·¨£¬Õâ¸ö·½·¨¾Í¿ÉÒÔ½â´ðËùÓеÄÒÉ»ó£º

//½ÓÊÜÒ»¸öÈë²Îobject,²¢·µ»ØÒ»¸öJSValue
- (JSValue *)jsWrapperForObject:(id)object
{
//¶ÔÓÚÿ¸ö¶ÔÏó£¬ÓÐרÃŵÄjsWrapper
JSC::JSObject* jsWrapper = m_cachedJSWrappers.get(object);
if (jsWrapper)
return [JSValue valueWithJSValueRef:toRef(jsWrapper) inContext:m_context];
JSValue *wrapper;
//Èç¹û¸Ã¶ÔÏóÊǸöÀà¶ÔÏó£¬Ôò»áÖ±½ÓÄõ½classInfoµÄconstructorΪʵ¼ÊµÄValue
if (class_isMetaClass(object_getClass(object)))
wrapper = [[self classInfoForClass:(Class)object] constructor];
else {
//¶ÔÓÚÆÕͨµÄʵÀý¶ÔÏó£¬ÓɶÔÓ¦µÄclassInfo¸ºÔðÉú³ÉÏàÓ¦JSWrappperͬʱretain¶ÔÓ¦µÄOC¶ÔÏ󣬲¢ÉèÖÃÏàÓ¦µÄPrototype
JSObjCClassInfo* classInfo = [self classInfoForClass:[object class]];
wrapper = [classInfo wrapperForObject:object];
}
JSC::ExecState* exec = toJS([m_context JSGlobalContextRef]);
//½«wrapperµÄֵдÈëJS»·¾³
jsWrapper = toJS(exec, valueInternalValue(wrapper)).toObject(exec);
//»º´æobjectµÄwrapper¶ÔÏó
m_cachedJSWrappers.set(object, jsWrapper);
return wrapper;
}

ÔÚÎÒÃÇ´´½¨"JSWrapperObject"µÄ¶ÔÏó¹ý³ÌÖУ¬ÎÒÃÇ»áͨ¹ýJSWrapperMapÀ´ÎªÃ¿¸ö´«ÈëµÄ¶ÔÏó´´½¨¶ÔÓ¦µÄJSObjCClassInfo¡£ÕâÊÇÒ»¸ö·Ç³£ÖØÒªµÄÀ࣬ËüÓÐÕâ¸öÀà¶ÔÓ¦JS¶ÔÏóµÄÔ­ÐÍ£¨Prototype£©Óë¹¹Ô캯Êý£¨Constructor£©¡£È»ºóÓÉJSObjCClassInfoÈ¥Éú³É¾ßÌåOC¶ÔÏóµÄJSWrapper¶ÔÏó£¬Õâ¸öJSWrapper¶ÔÏóÖоÍÓÐÒ»¸öJS¶ÔÏóËùÐèÒªµÄËùÓÐÐÅÏ¢£¨¼´PrototypeºÍConstructor£©ÒÔ¼°¶ÔÓ¦OC¶ÔÏóµÄÖ¸Õë¡£Ö®ºó£¬°ÑÕâ¸öjsWrapper¶ÔÏóдÈëJS»·¾³ÖУ¬¼´¿ÉÔÚJS»·¾³ÖÐʹÓÃÕâ¸ö¶ÔÏóÁË¡£ÕâÒ²¾ÍÊÇ"JSWrapperObject"µÄÕæÃæÄ¿¡£¶øÎÒÃÇÉÏÎÄÖÐÌáµ½£¬Èç¹û´«ÈëµÄÊÇÀ࣬ÄÇôÔÚJS»·¾³ÖлáÉú³Éconstructor¶ÔÏó£¬ÄÇôÕâµãÒ²ºÜÈÝÒ×´ÓÔ´ÂëÖп´µ½£¬µ±¼ì²âµ½´«ÈëµÄÊÇÀàµÄʱºò£¨Àà±¾ÉíÒ²ÊǸö¶ÔÏ󣩣¬Ôò»áÖ±½Ó·µ»ØconstructorÊôÐÔ£¬ÕâÒ²¾ÍÊÇ"constructor object"µÄÕæÃæÄ¿£¬Êµ¼ÊÉϾÍÊÇÒ»¸ö¹¹Ô캯Êý¡£

ÄÇÏÖÔÚ»¹ÓÐÁ½¸öÎÊÌ⣬µÚÒ»¸öÎÊÌâÊÇ£¬OC¶ÔÏóÓÐ×Ô¼ºµÄ¼Ì³Ð¹ØÏµ£¬ÄÇôÔÚJS»·¾³ÖÐÈçºÎÃèÊöÕâ¸ö¼Ì³Ð¹ØÏµ£¿µÚ¶þ¸öÎÊÌâÊÇ£¬JSExportµÄ·½·¨ºÍÊôÐÔ£¬ÓÖÊÇÈçºÎÈÃJS»·¾³Öе÷ÓõÄÄØ£¿

ÎÒÃÇÏÈ¿´µÚÒ»¸öÎÊÌ⣬¼Ì³Ð¹ØÏµÒªÈçºÎ½â¾ö£¿ÔÚJSÖУ¬¼Ì³ÐÊÇͨ¹ýÔ­ÐÍÁ´À´ÊµÏÖ£¬ÄÇʲôÊÇÔ­ÐÍÄØ£¿Ô­ÐͶÔÏóÊÇÒ»¸öÆÕͨ¶ÔÏ󣬶øÇÒ¾ÍÊǹ¹Ô캯ÊýµÄÒ»¸öʵÀý¡£ËùÓÐͨ¹ý¸Ã¹¹Ô캯ÊýÉú³ÉµÄ¶ÔÏó¶¼¹²ÏíÕâÒ»¸ö¶ÔÏ󣬵±²éÕÒij¸ö¶ÔÏóµÄÊôÐÔÖµ£¬½á¹û²»´æÔÚʱ£¬Õâʱ¾Í»áÈ¥¶ÔÏóµÄÔ­ÐͶÔÏó¼ÌÐøÕÒѰ£¬ÊÇ·ñ´æÔÚ¸ÃÊôÐÔ£¬ÕâÑù¾Í´ïµ½ÁËÒ»¸ö·â×°µÄÄ¿µÄ¡£ÎÒÃÇͨ¹ýÒ»¸öPersonÔ­ÐͶÔÏó¿ìËÙÁ˽⣺

//Ô­ÐͶÔÏóÊÇÒ»¸öÆÕͨ¶ÔÏ󣬶øÇÒ¾ÍÊÇPerson¹¹Ô캯ÊýµÄÒ»¸öʵÀý¡£ËùÓÐPerson¹¹Ô캯ÊýµÄʵÀý¶¼¹²ÏíÕâÒ»¸öÔ­ÐͶÔÏó¡£

//Ô­ÐͶÔÏóÊÇÒ»¸öÆÕͨ¶ÔÏ󣬶øÇÒ¾ÍÊÇPerson¹¹Ô캯ÊýµÄÒ»¸öʵÀý¡£ËùÓÐPerson¹¹Ô캯ÊýµÄʵÀý¶¼¹²ÏíÕâÒ»¸öÔ­ÐͶÔÏó¡£
Person.prototype = {
name: 'tony stark',
age: 48,
job: 'Iron Man',
sayName: function() {
alert(this.name);
}
}

¶øÔ­ÐÍÁ´¾ÍÊÇJSÖÐʵÏּ̳еĹؼü£¬ËüµÄ±¾ÖʾÍÊÇÖØÐ´¹¹Ô캯ÊýµÄÔ­ÐͶÔÏó£¬Á´½ÓÁíÒ»¸ö¹¹Ô캯ÊýµÄÔ­ÐͶÔÏó¡£ÕâÑù²éÕÒij¸ö¶ÔÏóµÄÊôÐÔ£¬»áÑØ×ÅÕâÌõÔ­ÐÍÁ´Ò»Ö±²éÕÒÏÂÈ¥£¬´Ó¶ø´ïµ½¼Ì³ÐµÄÄ¿µÄ¡£ÎÒÃÇͨ¹ýÒ»¸öÀý×Ó¿ìËÙÁ˽âһϣº

function mammal (){}
mammal.prototype.commonness = function(){
alert('²¸È鶯Îï¶¼Ó÷κôÎü');
};

function Person() {}
Person.prototype = new mammal();//Ô­ÐÍÁ´µÄÉú³É,PersonµÄʵÀýÒ²¿ÉÒÔ·ÃÎÊcommonnessÊôÐÔÁË
Person.prototype.name = 'tony stark';
Person.prototype.age = 48;
Person.prototype.job = 'Iron Man';
Person.prototype.sayName = function() {
alert(this.name);
}

var person1 = new Person();
person1.commonness(); // µ¯³ö'²¸È鶯Îï¶¼Ó÷κôÎü'
person1.sayName(); // 'tony stark'

¼û"allocateConstructorAndPrototypeWithSuperClassInfo"£©£¬»¹»áÉú³É¸¸ÀàµÄclassInfo¡£¶Ôÿ¸öʵÏÖ¹ýJSExportµÄOCÀ࣬JSContextÀï¶¼»áÌṩһ¸öprototype¡£±ÈÈçNSObjectÀ࣬ÔÚJSÀïÃæ¾Í»áÓжÔÓ¦µÄObject Prototype¡£¶ÔÓÚÆäËüµÄOCÀ࣬»á´´½¨¶ÔÓ¦µÄPrototype£¬Õâ¸öprototypeµÄÄÚ²¿ÊôÐÔ[Prototype]»áÖ¸ÏòΪÕâ¸öOCÀàµÄ¸¸Àà´´½¨µÄPrototype¡£Õâ¸öJSÔ­ÐÍÁ´¾ÍÄÜ·´Ó¦³ö¶ÔÓ¦OCÀàµÄ¼Ì³Ð¹ØÏµ£¬ÔÚÉÏÀýÖУ¬Person.prototype±»¸³ÖµÎªÒ»¸ömammalµÄʵÀý¶ÔÏ󣬼´Ô­Ð͵ÄÁ´½Ó¹ý³Ì¡£

½²ÍêµÚÒ»¸öÎÊÌ⣬ÎÒÃÇÔÙÀ´¿´¿´µÚ¶þ¸öÎÊÌâ¡£ÄÇJSExportÊÇÈçºÎ±©Â¶OC·½·¨µ½JS»·¾³µÄÄØ£¿Õâ¸öÎÊÌâµÄ´ð°¸Í¬Ñù³öÏÖÔÚÎÒÃÇÉú³É¶ÔÏóµÄclassInfoµÄʱºò£º

Protocol *exportProtocol = getJSExportProtocol();
forEachProtocolImplementingProtocol(m_class, exportProtocol, ^(Protocol *protocol){
copyPrototypeProperties(m_context, m_class, protocol, prototype);
copyMethodsToObject(m_context, m_class, protocol, NO, constructor);
});

¶ÔÓÚÿ¸öÉùÃ÷ÔÚJSExportÀïµÄÊôÐԺͷ½·¨£¬classInfo»áÔÚprototypeºÍconstructorÀïÃæ´æÈë¶ÔÓ¦µÄpropertyºÍmethod¡£Ö®ºóÎÒÃǾͿÉÒÔͨ¹ý¾ßÌåµÄmethodNameºÍPropertyNameÉú³ÉµÄsetterºÍgetter·½·¨£¬À´»ñȡʵ¼ÊµÄSEL¡£×îºó¾Í¿ÉÒÔÈÃJSExportÖеķ½·¨ºÍÊôÐԵõ½ÕýÈ·µÄ·ÃÎÊ¡£ËùÒÔ¼òµ¥µã½²£¬JSExport¾ÍÊǸºÔð°ÑÕâЩ·½·¨´ò¸ö±ê£¬ÒÔmethodNameΪkey£¬SELΪvalue£¬´æÈëÒ»¸ömap£¨prototypeºÍconstructor±¾ÖÊÉϾÍÊÇÒ»¸öMap£©ÖÐÈ¥£¬Ö®ºó¾Í¿ÉÒÔͨ¹ýmethodNameÄõ½¶ÔÓ¦µÄSEL½øÐе÷Óá£ÕâÒ²¾Í½âÊÍÁËÉÏÀýÖУ¬ÎÒÃǵ÷ÓÃÒ»¸öûÓÐÔÚJSExportÖпª·ÅµÄ·½·¨»áÏÔʾundefined£¬ÒòΪÉú³ÉµÄ¶ÔÏóÀï¸ù±¾Ã»ÓÐÕâ¸ökey¡£

×ܽá

JSCore¸øiOS AppÌṩÁËJS¿ÉÒÔ½âÊÍÖ´ÐеÄÔËÐл·¾³Óë×ÊÔ´¡£¶ÔÓÚÎÒÃÇʵ¼Ê¿ª·¢¶øÑÔ£¬×îÖ÷ÒªµÄ¾ÍÊÇJSContextºÍJSValueÕâÁ½¸öÀà¡£JSContextÌṩ»¥Ïàµ÷ÓõĽӿڣ¬JSValueΪÕâ¸ö»¥Ïàµ÷ÓÃÌṩÊý¾ÝÀàÐ͵ÄÇŽÓת»»¡£ÈÃJS¿ÉÒÔÖ´ÐÐNative·½·¨£¬²¢ÈÃNative»Øµ÷JS£¬·´Ö®ÒàÈ»¡£

ÀûÓÃJSCore£¬ÎÒÃÇ¿ÉÒÔ×öºÜ¶àÓÐÏëÏó¿Õ¼äµÄÊ¡£ËùÓлùÓÚJSCoreµÄHybrid¿ª·¢»ù±¾¾ÍÊÇ¿¿ÉÏͼµÄÔ­ÀíÀ´ÊµÏÖ»¥Ïàµ÷Óã¬Çø±ðÖ»ÊǾßÌåµÄʵÏÖ·½Ê½ºÍÓÃ;²»´óÏàͬ¡£´óµÀÖÁ¼ò£¬Ö»ÒªÕýÈ·Àí½âÕâ¸ö»ù±¾Á÷³Ì£¬ÆäËüµÄËùÓз½°¸²»¹ýÊÇһЩ±äͨ£¬¶¼¿ÉÒԺܿìÕÆÎÕ¡£

һЩÒýÉêÔĶÁ

JSPatchµÄ¶ÔÏóºÍ·½·¨Ã»ÓÐʵÏÖJSExportЭÒ飬JSÊÇÈçºÎµ÷OC·½·¨µÄ£¿

JSµ÷OC²¢²»ÊÇͨ¹ýJSExport¡£Í¨¹ýJSExportʵÏֵķ½Ê½ÓÐÖî¶àÎÊÌ⣬ÎÒÃÇÐèÒªÏÈдºÃNativeµÄÀ࣬²¢ÊµÏÖJSExportЭÒ飬Õâ¸ö±¾Éí¾Í²»ÄÜÂú×ã¡°Patch¡±µÄÐèÇó¡£

ËùÒÔJSPatchÁí±Ùõè¾¶£¬Ê¹ÓÃÁËOCµÄRuntimeÏûϢת·¢»úÖÆ×öÕâ¸öÊÂÇ飬ÈçÏÂÃæÕâÒ»¸ö¼òµ¥µÄJSPatchµ÷ÓôúÂ룺

require('UIView')
var view = UIView.alloc().init()

1.requireÔÚÈ«¾Ö×÷ÓÃÓòÀïÉú³ÉUIView±äÁ¿£¬À´±íʾÕâ¸ö¶ÔÏóÊÇÒ»¸öOCClass¡£

2.ͨ¹ýÕýÔò°Ñ.alloc()¸Ä³É._c('alloc')£¬À´½øÐз½·¨ÊÕ¿Ú£¬×îÖÕ»áµ÷ÓÃ_methodFunc()°ÑÀàÃû¡¢¶ÔÏó¡¢MethodNameͨ¹ýÔÚContextÔçÒѶ¨ÒåºÃµÄNative·½·¨£¬´«¸øOC»·¾³¡£

3.×îÖÕµ÷ÓÃOCµÄCallSelector·½·¨£¬µ×²ãͨ¹ý´ÓJS»·¾³Äõ½µÄÀàÃû¡¢·½·¨Ãû¡¢¶ÔÏóÖ®ºó£¬Í¨¹ýNSInvocationʵÏÖ¶¯Ì¬µ÷Óá£

JSPatchµÄͨÐŲ¢Ã»ÓÐͨ¹ýJSExportЭÒ飬¶øÊǽèÖúJSCoreµÄContextÓëJSCoreµÄÀàÐÍת»»ºÍOCµÄÏûϢת·¢»úÖÆÀ´Íê³É¶¯Ì¬µ÷Óã¬ÊµÏÖË¼Â·ÕæµÄºÜÇÉÃî¡£

ÇÅ·½·¨µÄʵÏÖÊÇÔõôͨ¹ýJSCore½»»¥µÄ£¿

ÊÐÃæÉϳ£¼ûµÄÇÅ·½·¨µ÷ÓÃÓÐÁ½ÖÖ£º

1.ͨ¹ýUIWebViewµÄdelegate·½·¨£ºshouldStartLoadWithRequestÀ´´¦ÀíÇŽÓJSÇëÇó¡£JSRequest»á´øÉÏmethodName£¬Í¨¹ýWebViewBridgeÀàµ÷ÓøÃmethod¡£Ö´ÐÐÍêÖ®ºó£¬»áʹÓÃWebViewÀ´Ö´ÐÐJSµÄ»Øµ÷·½·¨£¬µ±È»Êµ¼ÊÉÏÒ²Êǵ÷ÓõÄWebViewÖеÄJSContextÀ´Ö´ÐÐJS£¬Íê³ÉÕû¸öµ÷Óûص÷Á÷³Ì¡£

2.ͨ¹ýUIWebViewµÄdelegate·½·¨£ºÔÚwebViewDidFinishLoadwebViewDidFinishLoadÀïͨ¹ýKVCµÄ·½Ê½»ñÈ¡UIWebViewµÄJSContext£¬È»ºóͨ¹ýÕâ¸öJSContextÉèÖÃÒѾ­×¼±¸ºÃµÄÇÅ·½·¨¹©JS»·¾³µ÷Óá£

   
4469 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì