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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaScriptCoreÈ«Ãæ½âÎö £¨ÉÏÆª£©
 
À´Ô´£ºÌÚÑ¶ÔÆ ·¢²¼ÓÚ£º2017-5-25
  2656  次浏览      27
 

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ЭÒé¿ÉÑ¡ÔñÐԵص¼³öÊôÐԺͷ½·¨¡£

ºóÃæ»áÏêϸ½²½â¶ÔÏóÀàÐ͵Äת»»¡£

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

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

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

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