JavaScriptÔ½À´Ô½¶àµØ³öÏÖÔÚÎÒÃǿͻ§¶Ë¿ª·¢µÄÊÓÒ°ÖУ¬´ÓReactNativeµ½JSpatch£¬JavaScriptÓë¿Í»§¶ËÏà½áºÏµÄ¼¼Êõ¿ªÊ¼±äµÃ÷ÈÁ¦ÎÞÇî¡£±¾ÎÄÖ÷Òª½²½âiOSÖеÄJavaScriptCore¿ò¼Ü£¬ÕýÊÇËüΪiOSÌṩÁËÖ´ÐÐJavaScript´úÂëµÄÄÜÁ¦¡£Î´À´µÄ¼¼ÊõÈÕÐÂÔÂÒ죬JavaScriptÓëiOSÕýÔÚÅöײ³öеļ¤Çé¡£
JavaScriptCoreÊÇJavaScriptµÄÐéÄâ»ú£¬ÎªJavaScriptµÄÖ´ÐÐÌṩµ×²ã×ÊÔ´¡£
Ò»¡¢JavaScript
ÔÚÌÖÂÛJavaScriptCore֮ǰ£¬ÎÒÃÇÊ×ÏȱØÐë¶ÔJavaScriptÓÐËùÁ˽⡣
1. JavaScript¸ÉɶµÄ£¿
1.˵µÄ¸ß´óÉÏÒ»µã£ºÒ»ÃÅ»ùÓÚÔÐÍ¡¢º¯ÊýÏÈÐеĸ߼¶±à³ÌÓïÑÔ£¬Í¨¹ý½âÊÍÖ´ÐУ¬ÊǶ¯Ì¬ÀàÐ͵ÄÖ±ÒëÓïÑÔ¡£ÊÇÒ»ÃŶ෶ʽµÄÓïÑÔ£¬ËüÖ§³ÖÃæÏò¶ÔÏó±à³Ì£¬ÃüÁîʽ±à³Ì£¬ÒÔ¼°º¯Êýʽ±à³Ì¡£
2.˵µÄͨË×Ò»µã£ºÖ÷ÒªÓÃÓÚÍøÒ³£¬ÎªÆäÌṩ¶¯Ì¬½»»¥µÄÄÜÁ¦¡£¿ÉǶÈ붯̬Îı¾ÓÚHTMLÒ³Ãæ£¬¶Ôä¯ÀÀÆ÷ʼþ×÷³öÏìÓ¦£¬¶ÁдHTMLÔªËØ£¬¿ØÖÆcookiesµÈ¡£
3.ÔÙͨË×Ò»µã£ºÇÀÔ±ý£¬button.click()¡££¨PS£ºÇë½÷É÷ʹÓÃwhileÑ»·£©

2. JavaScriptÆðÔ´ÓëÀúÊ·
1.1990Äêµ×£¬Å·ÖÞºËÄÜÑо¿×éÖ¯£¨CERN£©¿ÆÑ§¼ÒTim Berners-Lee£¬ÔÚ»¥ÁªÍøµÄ»ù´¡ÉÏ£¬·¢Ã÷ÁËÍòÎ¬Íø£¨World
Wide Web£©£¬´Ó´Ë¿ÉÒÔÔÚÍøÉÏä¯ÀÀÍøÒ³Îļþ¡£
2.1994Äê12Ô£¬Netscape ·¢²¼ÁËÒ»¿îÃæÏòÆÕͨÓû§µÄÐÂÒ»´úµÄä¯ÀÀÆ÷Navigator
1.0°æ£¬Êг¡·Ý¶îÒ»¾Ù³¬¹ý90%¡£
3.1995Ä꣬Netscape¹«Ë¾¹ÍÓ¶Á˳ÌÐòÔ±Brendan Eich¿ª·¢ÕâÖÖǶÈëÍøÒ³µÄ½Å±¾ÓïÑÔ¡£×î³õÃû×Ö½Ð×öMocha£¬1995Äê9Ô¸ÄΪLiveScript¡£
4.1995Äê12Ô£¬Netscape¹«Ë¾ÓëSun¹«Ë¾´ï³ÉÐÒ飬ºóÕßÔÊÐí½«ÕâÖÖÓïÑÔ½Ð×ö
JavaScript¡£
3. JavaScriptÓëECMAScript
1.¡°JavaScript¡±ÊÇSun¹«Ë¾µÄ×¢²áÉ̱꣬ÓÃÀ´ÌØÖÆÍø¾°£¨ÏÖÔÚµÄMozilla£©¶ÔÓÚÕâÃÅÓïÑÔµÄʵÏÖ¡£Íø¾°½«ÕâÃÅÓïÑÔ×÷Ϊ±ê×¼Ìá½»¸øÁËECMA¡ª¡ªÅ·ÖÞ¼ÆËã»úÖÆÔìлᡣÓÉÓÚÉ̱êÉϵijåÍ»£¬ÕâÃÅÓïÑԵıê×¼°æ±¾¸ÄÁËÒ»¸ö³óªµÄÃû×Ö¡°ECMAScript¡±¡£Í¬ÑùÓÉÓÚÉ̱êµÄ³åÍ»£¬Î¢Èí¶ÔÕâÃÅÓïÑÔµÄʵÏְ汾ȡÁËÒ»¸ö¹ãΪÈËÖªµÄÃû×Ö¡°Jscript¡±¡£
2.ECMAScript×÷ΪJavaScriptµÄ±ê×¼£¬Ò»°ãÈÏΪºóÕßÊÇǰÕßµÄʵÏÖ¡£
4. JavaºÍJavaScript

¡¶À×·æºÍÀ×·åËþ¡·
Java ºÍ JavaScript ÊÇÁ½ÃŲ»Í¬µÄ±à³ÌÓïÑÔ
Ò»°ãÈÏΪ£¬µ±Ê± Netscape Ö®ËùÒÔ½« LiveScript
ÃüÃûΪ JavaScript£¬ÊÇÒòΪ Java Êǵ±Ê±×îÁ÷Ðеıà³ÌÓïÑÔ£¬´øÓÐ ¡°Java¡± µÄÃû×ÖÓÐÖúÓÚÕâÃÅÐÂÉúÓïÑԵĴ«²¥¡£
¶þ¡¢ JavaScriptCore
1. ä¯ÀÀÆ÷Ñݽø
ÑݽøÍêÕûͼ
https://upload.wikimedia.org /wikipedia/commons
/7/74/Timeline _of_web _browsers.svg
WebKit·ÖÖ§
ÏÖÔÚʹÓÃWebKitµÄÖ÷ÒªÁ½¸öä¯ÀÀÆ÷SfariºÍChromium£¨ChormeµÄ¿ªÔ´ÏîÄ¿£©¡£WebKitÆðÔ´ÓÚKDEµÄ¿ªÔ´ÏîÄ¿KonquerorµÄ·ÖÖ§£¬ÓÉÆ»¹û¹«Ë¾ÓÃÓÚSfariä¯ÀÀÆ÷¡£ÆäÒ»Ìõ·ÖÖ§·¢Õ¹³ÉΪChormeµÄÄںˣ¬2013ÄêGoogleÔÚ´Ë»ù´¡ÉÏ¿ª·¢ÁËеÄBlinkÄںˡ£

2. WebKitÅŰæÒýÇæ
webkitÊÇsfari¡¢chromeµÈä¯ÀÀÆ÷µÄÅŰæÒýÇæ£¬¸÷²¿·Ö¼Ü¹¹Í¼ÈçÏÂ

webkit Embedding APIÊÇbrowser UIÓëwebpage½øÐн»»¥µÄapi½Ó¿Ú£»
platformAPIÌṩÓëµ×²ãÇý¶¯µÄ½»»¥£¬ ÈçÍøÂ磬 ×ÖÌåäÖȾ£¬ Ó°ÒôÎļþ½âÂ룬 äÖȾÒýÇæµÈ£»
WebCoreËüʵÏÖÁ˶ÔÎĵµµÄÄ£ÐÍ»¯£¬°üÀ¨ÁËCSS, DOM, RenderµÈµÄʵÏÖ£»
JSCoreÊÇרÃÅ´¦ÀíJavaScript½Å±¾µÄÒýÇæ£»
3. JavaScriptÒýÇæ
JavaScriptÒýÇæÊÇרÃÅ´¦ÀíJavaScript½Å±¾µÄÐéÄâ»ú£¬Ò»°ã»á¸½´øÔÚÍøÒ³ä¯ÀÀÆ÷Ö®ÖС£µÚÒ»¸öJavaScriptÒýÇæÓɲ¼À¼µÇ¡¤°¬¿ËÔÚÍø¾°¹«Ë¾¿ª·¢£¬ÓÃÓÚNetscape
NavigatorÍøÒ³ä¯ÀÀÆ÷ÖС£JavaScriptCore¾ÍÊÇÒ»¸öJavaScriptÒýÇæ¡£
ÏÂͼÊǵ±Ç°Ö÷ÒªµÄ»¹ÔÚ¿ª·¢ÖеÄJavaScriptÒýÇæ

4. JavaScriptCore×é³É
JavaScriptCoreÖ÷ÒªÓÉÒÔÏÂÄ£¿é×é³É£º
1.Lexer ´Ê·¨·ÖÎöÆ÷£¬½«½Å±¾Ô´Âë·Ö½â³ÉһϵÁеÄToken
2.Parser Óï·¨·ÖÎöÆ÷£¬´¦ÀíToken²¢Éú³ÉÏàÓ¦µÄÓï·¨Ê÷
3.LLInt µÍ¼¶½âÊÍÆ÷£¬Ö´ÐÐParserÉú³ÉµÄ¶þ½øÖÆ´úÂë
4.Baseline JIT »ùÏßJIT£¨just in time
ʵʩ±àÒ룩
5.DFG µÍÑÓ³ÙÓÅ»¯µÄJIT
6.FTL ¸ßͨÁ¿ÓÅ»¯µÄJIT
¹ØÓÚ¸ü¶àJavaScriptCoreµÄʵÏÖϸ½Ú£¬²Î¿¼ https://trac
.webkit .org/wiki/ JavaScrip tCore
5. JavaScriptCore
JavaScriptCoreÊÇÒ»¸öC++ʵÏֵĿªÔ´ÏîÄ¿¡£Ê¹ÓÃAppleÌṩµÄJavaScriptCore¿ò¼Ü£¬Äã¿ÉÒÔÔÚObjective-C»òÕß»ùÓÚCµÄ³ÌÐòÖÐÖ´ÐÐJavascript´úÂ룬Ҳ¿ÉÒÔÏòJavaScript»·¾³ÖвåÈëһЩ×Ô¶¨ÒåµÄ¶ÔÏó¡£JavaScriptCore´ÓiOS
7.0Ö®ºó¿ÉÒÔÖ±½ÓʹÓá£
ÔÚJavaScriptCore.hÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½Õâ¸ö
#ifndef JavaScriptCore_h #define JavaScriptCore_h
#include <JavaScriptCore/
JavaScript.h>
#include <JavaScriptCore/
JSStringRefCF.h>
#if defined(__OBJC__) && JSC_
OBJC_API_ENABLED
#import "JSContext.h"
#import "JSValue.h"
#import "JSManagedValue.h"
#import "JSVirtualMachine.h"
#import "JSExport.h"
#endif
#endif /* JavaScriptCore_h */ |
ÕâÀïÒѾºÜÇåÎúµØÁгöÁËJavaScriptCoreµÄÖ÷Òª¼¸¸öÀࣺ
1.JSContext
2.JSValue
3.JSManagedValue
4.JSVirtualMachine
5.JSExport
½ÓÏÂÀ´ÎÒÃÇ»áÒÀ´Î½²½âÕ⼸¸öÀàµÄÓ÷¨¡£
6. Hello World£¡
Õâ¶Î´úÂëչʾÁËÈçºÎÔÚObjective-CÖÐÖ´ÐÐÒ»¶ÎJavaScript´úÂ룬²¢ÇÒ»ñÈ¡·µ»ØÖµ²¢×ª»»³ÉOCÊý¾Ý´òÓ¡
//´´½¨ÐéÄâ»ú JSVirtualMachine *vm = [[JSVirtua
lMachine alloc] init];
//´´½¨ÉÏÏÂÎÄ
JSContext *context = [[JSContext
alloc] initWithVirtualMachine:vm];
//Ö´ÐÐJavaScript´úÂë²¢»ñÈ¡·µ»ØÖµ
JSValue *value = [context evaluat
eScript:@"1+2*3"];
//ת»»³ÉOCÊý¾Ý²¢´òÓ¡
NSLog(@"value = %d", [value toInt32]);
Output
value = 7 |
Èý¡¢ JSVirtualMachine
Ò»¸öJSVirtualMachineµÄʵÀý¾ÍÊÇÒ»¸öÍêÕû¶ÀÁ¢µÄJavaScriptµÄÖ´Ðл·¾³£¬ÎªJavaScriptµÄÖ´ÐÐÌṩµ×²ã×ÊÔ´¡£
Õâ¸öÀàÖ÷ÒªÓÃÀ´×öÁ½¼þÊÂÇ飺
1.ʵÏÖ²¢·¢µÄJavaScriptÖ´ÐÐ
2.JavaScriptºÍObjective-CÇŽӶÔÏóµÄÄÚ´æ¹ÜÀí
¿´ÏÂÍ·ÎļþSVirtualMachine.hÀïÓÐʲô£º
NS_CLASS_AVAILABLE(10_9, 7_0) @interface JSVirtualMachine :
NSObject
/* ´´½¨Ò»¸öеÄÍêÈ«¶ÀÁ¢µÄÐéÄâ»ú */
(instancetype)init;
/* ¶ÔÇŽӶÔÏó½øÐÐÄÚ´æ¹ÜÀí */
- (void)addManagedReference:(id)ob
ject withOwner:(id)owner;
/* È¡Ïû¶ÔÇŽӶÔÏóµÄÄÚ´æ¹ÜÀí */
- (void)removeManagedReference:
(id)object withOwner:(id)owner;
@end |
ÿһ¸öJavaScriptÉÏÏÂÎÄ£¨JSContext¶ÔÏ󣩶¼¹éÊôÓÚÒ»¸öÐéÄâ»ú£¨JSVirtualMachine£©¡£Ã¿¸öÐéÄâ»ú¿ÉÒÔ°üº¬¶à¸ö²»Í¬µÄÉÏÏÂÎÄ£¬²¢ÔÊÐíÔÚÕâЩ²»Í¬µÄÉÏÏÂÎÄÖ®¼ä´«Öµ£¨JSValue¶ÔÏ󣩡£
È»¶ø£¬Ã¿¸öÐéÄâ»ú¶¼ÊÇÍêÕûÇÒ¶ÀÁ¢µÄ£¬ÓÐÆä¶ÀÁ¢µÄ¶Ñ¿Õ¼äºÍÀ¬»ø»ØÊÕÆ÷£¨garbage
collector £©£¬GCÎÞ·¨´¦Àí±ðµÄÐéÄâ»ú¶ÑÖеĶÔÏó£¬Òò´ËÄã²»ÄܰÑÒ»¸öÐéÄâ»úÖд´½¨µÄÖµ´«¸øÁíÒ»¸öÐéÄâ»ú¡£

Ï̺߳ÍJavaScriptµÄ²¢·¢Ö´ÐÐ
JavaScriptCore API¶¼ÊÇḬ̈߳²È«µÄ¡£Äã¿ÉÒÔÔÚÈÎÒâÏ̴߳´½¨JSValue»òÕßÖ´ÐÐJS´úÂ룬Ȼ¶ø£¬ËùÓÐÆäËûÏëҪʹÓøÃÐéÄâ»úµÄÏ̶߳¼ÒªµÈ´ý¡£
1.Èç¹ûÏë²¢·¢Ö´ÐÐJS£¬ÐèҪʹÓöà¸ö²»Í¬µÄÐéÄâ»úÀ´ÊµÏÖ¡£
2.¿ÉÒÔÔÚ×ÓÏß³ÌÖÐÖ´ÐÐJS´úÂë¡£
ͨ¹ýÏÂÃæÕâ¸ödemoÀ´Àí½âÒ»ÏÂÕâ¸ö²¢·¢»úÖÆ
JSContext *context = [[CustomJSContext alloc]
init]; JSContext *context1 = [[CustomJSContext alloc]
init]; JSContext *context2 = [[CustomJSContext alloc]
initWithVirtualMachine:[context virtualMachine]]; NSLog(@"start"); dispatch_async(queue, ^{ while (true) { sleep(1); [context evaluateScript:@"log('tick')"]; } }); dispatch_async(queue1, ^{ while (true) { sleep(1); [context1 evaluateScript:@"log
('tick_1')"]; } }); dispatch_async(queue2, ^{ while (true) { sleep(1); [context2 evaluateScript:@"log
('tick_2')"]; } }); [context evaluateScript:@"sleep(5)"]; NSLog(@"end"); |
contextºÍcontext2ÊôÓÚͬһ¸öÐéÄâ»ú¡£
context1ÊôÓÚÁíÒ»¸öÐéÄâ»ú¡£
Èý¸öÏ̷ֱ߳ðÒì²½Ö´ÐÐÿÃë1´ÎµÄjs log£¬Ê×ÏÈ»áÐÝÃß1Ãë¡£
ÔÚcontextÉÏÖ´ÐÐÒ»¸öÐÝÃß5ÃëµÄJSº¯Êý¡£
Ê×ÏÈÖ´ÐеÄÓ¦¸ÃÊÇÐÝÃß5ÃëµÄJSº¯Êý£¬ÔÚ´ËÆÚ¼ä£¬contextËù´¦µÄÐéÄâ»úÉÏµÄÆäËûµ÷Óö¼»á´¦Óڵȴý״̬£¬Òò´ËtickºÍtick_2ÔÚǰ5Ãë¶¼²»»áÓÐÖ´ÐС£
¶øcontext1Ëù´¦µÄÐéÄâ»úÈÔÈ»¿ÉÒÔÕý³£Ö´ÐÐtick_1¡£
ÐÝÃß5Ãë½áÊøºó£¬tickºÍtick_2²Å»á¿ªÊ¼Ö´ÐУ¨²»±£Ö¤ÏȺó˳Ðò£©¡£
ʵ¼ÊÔËÐÐÊä³öµÄlogÊÇ£º
start tick_1 tick_1 tick_1 tick_1 end tick tick_2 |
ËÄ¡¢ JSContext
Ò»¸öJSContext¶ÔÏó´ú±íÒ»¸öJavaScriptÖ´Ðл·¾³¡£ÔÚnative´úÂëÖУ¬Ê¹ÓÃJSContextÈ¥Ö´ÐÐJS´úÂ룬·ÃÎÊJSÖж¨Òå»òÕß¼ÆËãµÄÖµ£¬²¢Ê¹JavaScript¿ÉÒÔ·ÃÎÊnativeµÄ¶ÔÏó¡¢·½·¨¡¢º¯Êý¡£
1. JSContextÖ´ÐÐJS´úÂë
µ÷ÓÃevaluateScriptº¯Êý¿ÉÒÔÖ´ÐÐÒ»¶Îtop-level µÄJS´úÂ룬²¢¿ÉÏòglobal¶ÔÏóÌí¼Óº¯ÊýºÍ¶ÔÏó¶¨Òå
Æä·µ»ØÖµÊÇJavaScript´úÂëÖÐ×îºóÒ»¸öÉú³ÉµÄÖµ
API Reference
NS_CLASS_AVAILABLE(10_9, 7_0) @interface JSContext : NSObject
/* ´´½¨Ò»¸öJSContext£¬Í¬Ê±»á´´
½¨Ò»¸öеÄJSVirtualMachine */
(instancetype)init;
/* ÔÚÖ¸¶¨ÐéÄâ»úÉÏ´´½¨Ò»¸öJSContext */
(instancetype)initWithVirtualMachine:
(JSVirtualMachine*)virtualMachine;
/* Ö´ÐÐÒ»¶ÎJS´úÂ룬·µ»Ø×îºóÉú
³ÉµÄÒ»¸öÖµ */
(JSValue *)evaluateScript:
(NSString *)script;
/* Ö´ÐÐÒ»¶ÎJS´úÂ룬²¢½«source
URLÈÏ×÷ÆäÔ´ÂëURL£¨½ö×÷±ê¼ÇÓã© */
- (JSValue *)evaluateScript:
(NSString *)script withSourceURL
:(NSURL*)sourceURL NS_AVAILABLE(10_10, 8_0);
/* »ñÈ¡µ±Ç°Ö´ÐеÄJavaScript´úÂëµÄcontext */
+ (JSContext *)currentContext;
/* »ñÈ¡µ±Ç°Ö´ÐеÄJavaScript function*/
+ (JSValue *)currentCallee NS_AVAILABLE
(10_10, 8_0);
/* »ñÈ¡µ±Ç°Ö´ÐеÄJavaScript´úÂëµÄthis */
+ (JSValue *)currentThis;
/* Returns the arguments to the current
native callback from JavaScript code.*/
+ (NSArray *)currentArguments;
/* »ñÈ¡µ±Ç°contextµÄÈ«¾Ö¶ÔÏó¡£WebKitÖÐ
µÄcontext·µ»ØµÄ±ãÊÇWindowProxy¶ÔÏó*/
@property (readonly, strong) JSValue
*globalObject;
@property (strong) JSValue *exception;
@property (copy) void(^exceptionHandler)
(JSContext *context, JSValue
*exception);
@property (readonly, strong) JSVirtual
Machine *virtualMachine;
@property (copy) NSString *name NS_
AVAILABLE(10_10, 8_0);
@end
|
2. JSContext·ÃÎÊJS¶ÔÏó
Ò»¸öJSContext¶ÔÏó¶ÔÓ¦ÁËÒ»¸öÈ«¾Ö¶ÔÏó£¨global object£©¡£ÀýÈçwebä¯ÀÀÆ÷ÖÐÖеÄJSContext£¬ÆäÈ«¾Ö¶ÔÏó¾ÍÊÇwindow¶ÔÏó¡£ÔÚÆäËû»·¾³ÖУ¬È«¾Ö¶ÔÏóÒ²³Ðµ£ÁËÀàËÆµÄ½ÇÉ«£¬ÓÃÀ´Çø·Ö²»Í¬µÄJavaScript
contextµÄ×÷ÓÃÓò¡£È«¾Ö±äÁ¿ÊÇÈ«¾Ö¶ÔÏóµÄÊôÐÔ£¬¿ÉÒÔͨ¹ýJSValue¶ÔÏó»òÕßcontextϱêµÄ·½Ê½À´·ÃÎÊ¡£
Ò»ÑÔ²»ºÏÉÏ´úÂ룺
JSValue *value = [context
evaluateScript:@"var a = 1+2*3;"];
NSLog(@"a = %@", [context
objectForKeyedSubscript:@"a"]);
NSLog(@"a = %@", [context.globalOb
ject objectForKeyedSubscript:@"a"]);
NSLog(@"a = %@", context[@"a"]);
/
Output:
a = 7
a = 7
a = 7 |
ÕâÀïÁгöÁËÈýÖÖ·ÃÎÊJavaScript¶ÔÏóµÄ·½·¨
1.ͨ¹ýcontextµÄʵÀý·½·¨objec tForKeyedSub
script
2.ͨ¹ýcontext.globalObjectµÄobject ForKeyedS
ubscriptʵÀý·½·¨
3.ͨ¹ýϱ귽ʽ
ÉèÖÃÊôÐÔÒ²ÊǶÔÓ¦µÄ¡£
API Reference
/* ΪJSContextÌṩϱê·ÃÎÊÔªËØµÄ·½Ê½ */ @interface JSContext (SubscriptSupport)
/* Ê×ÏȽ«keyתΪJSValue¶ÔÏó£¬È»ºó
ʹÓÃÕâ¸öÖµÔÚJavaScript contextµÄ
È«¾Ö¶ÔÏóÖвéÕÒÕâ¸öÃû×ÖµÄÊôÐÔ²¢·µ»Ø */
(JSValue *)objectForKeyedSubscript
:(id)key;
/* Ê×ÏȽ«keyתΪJSValue¶ÔÏó£¬È»ºóÓÃ
Õâ¸öÖµÔÚJavaScript contextµÄÈ«¾Ö¶ÔÏó
ÖÐÉèÖÃÕâ¸öÊôÐÔ¡£
¿ÉʹÓÃÕâ¸ö·½·¨½«nativeÖеĶÔÏó»òÕß·½·¨
ÇŽӸøJavaScriptµ÷Óà */
(void)setObject:(id)object forKeyed
Subscript:(NSObject <NSCopying>*)key;
@end
/* ÀýÈ磺ÒÔÏ´úÂëÔÚJavaScriptÖд´½¨
ÁËÒ»¸öʵÏÖÊÇObjective-C blockµÄfunction */
context[@"makeNSColor"] = ^(NSDictionary
*rgb){
float r = [rgb[@"red"] floatValue];
float g = [rgb[@"green"] floatValue];
float b = [rgb[@"blue"] floatValue];
return [NSColor colorWithRed:(r / 255.f)
green:(g / 255.f) blue:(b / 255.f) alpha:1.0];
};
JSValue *value = [context evaluateScript
:@"makeNSColor({red:12, green:23, blue:67})"]; |
Îå¡¢ JSValue
Ò»¸öJSValueʵÀý¾ÍÊÇÒ»¸öJavaScriptÖµµÄÒýÓá£Ê¹ÓÃJSValueÀàÔÚJavaScriptºÍnative´úÂëÖ®¼äת»»Ò»Ð©»ù±¾ÀàÐ͵ÄÊý¾Ý£¨±ÈÈçÊýÖµºÍ×Ö·û´®£©¡£ÄãÒ²¿ÉÒÔʹÓÃÕâ¸öÀàÈ¥´´½¨°ü×°ÁË×Ô¶¨ÒåÀàµÄnative¶ÔÏóµÄJavaScript¶ÔÏ󣬻òÕß´´½¨ÓÉnative·½·¨»òÕßblockʵÏÖµÄJavaScriptº¯Êý¡£
ÿ¸öJSValueʵÀý¶¼À´Ô´ÓÚÒ»¸ö´ú±íJavaScriptÖ´Ðл·¾³µÄJSContext¶ÔÏó£¬Õâ¸öÖ´Ðл·¾³¾Í°üº¬ÁËÕâ¸öJSValue¶ÔÓ¦µÄÖµ¡£Ã¿¸öJSValue¶ÔÏó¶¼³ÖÓÐÆäJSContext¶ÔÏóµÄÇ¿ÒýÓã¬Ö»ÒªÓÐÈκÎÒ»¸öÓëÌØ¶¨JSContext¹ØÁªµÄJSValue±»³ÖÓУ¨retain£©£¬Õâ¸öJSContext¾Í»áÒ»Ö±´æ»î¡£Í¨¹ýµ÷ÓÃJSValueµÄʵÀý·½·¨·µ»ØµÄÆäËûµÄJSValue¶ÔÏó¶¼ÊôÓÚÓë×îʼµÄJSValueÏàͬµÄJSContext¡£

ÿ¸öJSValue¶¼Í¨¹ýÆäJSContext¼ä½Ó¹ØÁªÁËÒ»¸öÌØ¶¨µÄ´ú±íÖ´ÐÐ×ÊÔ´»ù´¡µÄJSVirtualMachine¶ÔÏó¡£ÄãÖ»Äܽ«Ò»¸öJSValue¶ÔÏ󴫸øÓÉÏàͬÐéÄâ»ú¹ÜÀí£¨host£©µÄJSValue»òÕßJSContextµÄʵÀý·½·¨¡£Èç¹û³¢ÊÔ°ÑÒ»¸öÐéÄâ»úµÄJSValue´«¸øÁíÒ»¸öÐéÄâ»ú£¬½«»á´¥·¢Ò»¸öObjective-CÒì³£¡£

1. JSValueÀàÐÍת»»
JSValueÌṩÁËһϵÁеķ½·¨½«nativeÓëJavaScriptµÄÊý¾ÝÀàÐͽøÐÐÏ໥ת»»£º

2. NSDictionaryÓëJS¶ÔÏó
NSDictionary¶ÔÏóÒÔ¼°Æä°üº¬µÄkeysÓëJavaScriptÖеĶÔÓ¦Ãû³ÆµÄÊôÐÔÏ໥ת»»¡£keyËù¶ÔÓ¦µÄÖµÒ²»áµÝ¹éµØ½øÐп½±´ºÍת»»¡£
¿É¼û£¬JSÖеĶÔÏó¿ÉÒÔÖ±½Óת»»³ÉObjective-CÖеÄNSDictionary£¬NSDictionary´«ÈëJavaScriptÒ²¿ÉÒÔÖ±½Óµ±×÷¶ÔÏó±»Ê¹Óá£
3. NSArrayÓëJSÊý×é
[context evaluateScript:@"var color
= {red:230, green:90, blue:100}"];
//js->native ¸øÄã¿´ÎÒµÄÑÕÉ«
JSValue *colorValue = context[@"color"];
NSLog(@"r=%@, g=%@, b=%@", colorValue
[@"red"], colorValue[@"green"],
colorValue[@"blue"]);
NSDictionary *colorDic = [colorValue
toDictionary];
NSLog(@"r=%@, g=%@, b=%@", colorDic
[@"red"], colorDic[@"green"],
colorDic[@"blue"]);
//native->js ¸øÄãµãÑÕÉ«¿´¿´
context[@"color"] = @{@"red":@(0),
@"green":@(0), @"blue":@(0)};
[context evaluateScript:@"log('r:'
+color.red+'g:'+color.green+' b:
'+color.blue)"];
Output:
r=230, g=90, b=100
r=230, g=90, b=100
r:0 g:0 b:0 |
NSArray¶ÔÏóÓëJavaScriptÖеÄarrayÏ໥תת¡£Æä×ÓÔªËØÒ²»áµÝ¹é
[context evaluateScript:@¡°var
friends = ['Alice','Jenny','XiaoMing']"];
//js->native Äã˵ÄĸöÊÇÕæ°®£¿
JSValue *friendsValue = context
[@"friends"];
NSLog(@"%@, %@, %@", friendsValue[0],
friendsValue[1], friendsValue[2]);
NSArray *friendsArray = [friendsValue
toArray];
NSLog(@"%@, %@, %@", friendsArray[0],
friendsArray[1], friendsArray[2]);
//native->js ÎÒ¾õXiaoMingºÍ²»²»´í
£¬¸øÄãÔÙÍÆ¼ö¸öJimmy
context[@"girlFriends"] = @[friends
Array[2], @"Jimmy"];
[context evaluateScript:@"log('girl
Friends :'+girlFriends[0]+' '
+girlFriends[1])"]; |
µØ½øÐп½±´ºÍת»»¡£
Output:
Alice, Jenny, XiaoMing Alice, Jenny, XiaoMing girlFriends : XiaoMing Jimmy |
4. Block/º¯ÊýºÍJS function
Objective-CÖеÄblockת»»³ÉJavaScriptÖеÄfunction¶ÔÏó¡£²ÎÊýÒÔ¼°·µ»ØÀàÐÍʹÓÃÏàͬµÄ¹æÔòת»»¡£
½«Ò»¸ö´ú±ínativeµÄblock»òÕß·½·¨µÄJavaScript function½øÐÐת»»½«»áµÃµ½ÄǸöblock»ò·½·¨¡£
ÆäËûµÄJavaScriptº¯Êý½«»á±»×ª»»ÎªÒ»¸ö¿ÕµÄdictionary¡£ÒòΪJavaScriptº¯ÊýÒ²ÊÇÒ»¸ö¶ÔÏó¡£
5. OC¶ÔÏóºÍJS¶ÔÏó
¶ÔÓÚËùÓÐÆäËûnativeµÄ¶ÔÏóÀàÐÍ£¬JavaScriptCore¶¼»á´´½¨Ò»¸öÓµÓÐconstructorÔÐÍÁ´µÄwrapper¶ÔÏó£¬ÓÃÀ´·´Ó³nativeÀàÐ͵ļ̳йØÏµ¡£Ä¬ÈÏÇé¿öÏ£¬native¶ÔÏóµÄÊôÐԺͷ½·¨²¢²»»áµ¼³ö¸øÆä¶ÔÓ¦µÄJavaScript
wrapper¶ÔÏó¡£Í¨¹ýJSExportÐÒé¿ÉÑ¡ÔñÐԵص¼³öÊôÐԺͷ½·¨¡£
ºóÃæ»áÏêϸ½²½â¶ÔÏóÀàÐ͵Äת»»¡£ |