±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÍøÂ磬±¾ÎÄÖ÷Òª½éÉÜÈÃä¯ÀÀÆ÷Äܹ»Õý³£¹¤×÷×îºËÐĵ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ÓïÑÔ±í´ïʽ£º
½«Æä±ê¼Ç»¯Ö®ºó¿ÉÒԵõ½Ï±íµÄÄÚÈÝ£º

Õâ¾ÍÊÇ´Ê·¨·ÖÎöÖ®ºóµÄ½á¹û£¬µ«ÊÇ´Ê·¨·ÖÎö²¢²»»á¹Ø×¢Ã¿¸ö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»·¾³µ÷Óá£
|