2013-10-03 23 views
8

facebook javscript SDK'yı kullanmaya başladım ve kaynak kodunu okurken ilginç bir şey buldum.Facebook JavaScript SDK'sındaki işlev açıklama yönteminin amacı nedir?

/** 
* Annotates a function with a meta object 
*/ 
function annotate(fn, meta) { 
    meta.superClass = fn.__superConstructor__; 
    fn.__TCmeta = meta; 
    return fn; 
} 

// export to global 
__w = annotate; 

/** 
* when using the annotate function 
*/ 
function sprintf(format) { 
    // function body 
} 
__w(sprintf, {"signature":"function(string)"}); // <-- what is the purpose of doing this? 

Yani, sorum için ne kullanılır ki: belowed olarak

kod örneği nedir? 'un yararı bunu yapıyor?

Bilginize, tüm kaynak kodu burada, sen kullanılıyor) açıklama yaparak bir sürü (görebildikleri yerdir

Bir yerli kuvvetli yazarak kurulum gibi görünen

http://connect.facebook.net/en_US/all/debug.js

+6

Aşağı oylama ve yakın oylama neden emin değil, bu ilginç bir soru ve SO kapsamında. Facebook'un bunu neden yaptığını da merak ediyorum. –

+2

Daha önce bahsettiğim şeyleri genişletmemi isteyen varsa, mutlu olurum :) –

cevap

3

:

/** 
* A recursive descent analyzer which takes a value and a typehint, validating 
* whether or not the value matches the typehint. 
* The function will call it self as long as both the value and the typehint 
* yields a nested component. This means that we will never recurse deeper 
* than needed, and also that we automatically get support for 
* > equals([], 'array<string>') // true 
* > equals(['string'], 'array') // true 
*/ 
function equals(value, node) { 
    var type = typeof value; 
    var subType; 
    var nextNode; 
    var nextValue; 

    //: Nullable types are delimited with a leading ? 
    //: ?string, ?boolean, etc. 
    var nullable = /^\?/.test(node); 
    if (nullable) { 
    node = node.substring(1); 
    } 

//: snip ... 

switch (type) { 
    // start by testing the most common types 
    case 'boolean': 
    case 'number': 
    case 'string': 
    case 'undefined': 
    break; 
    default: 
     //: snip ... 
     // let functions with signatures also match 'function' 
     type = value.__TCmeta && node !== 'function' 
     ? value.__TCmeta.signature 
     : 'function'; 
    } else if (type === 'object' || type === 'function') { 
     // HTMLObjectElements has a typeof function in FF 
     var constructor = value.constructor; 
     if (constructor && constructor.__TCmeta) { 
     // The value is a custom type 
     //: snip ... 
      while (constructor && constructor.__TCmeta) { 
      if (constructor.__TCmeta.type == node) { 
       type = node; 
       break; 
      } 
      constructor = constructor.__TCmeta.superClass; 
      } 
     //: snip ... 
     } 
     } 
    } 
} 

if (nullable && /undefined|null/.test(type)) { 
    return true; 
} 

if (type in typeInterfaces) { 
    var interfaces = typeInterfaces[type], i = interfaces.length; 
    while (i--) { 
    if (interfaces[i] === node) { 
     type = node; 
     break; 
    } 
    } 
} 

currentType.push(type); 
return nextValue && nextNode 
    ? node === type && equals(nextValue, nextNode) 
    : subType && nextNode 
    ? node === type && subType === nextNode 
    : node === type; 
} 

 

/** 
* Given a value and a typehint (can be a union type), this will return 
* whether or not the passed in value matches the typehint. 
*/ 
function matches(value, node) { 
    var nodes = node.split('|'), i = nodes.length; 
    while (i--) { 
    currentType = []; 
    if (equals(value, nodes[i])) { 
     return true; 
    } 
    } 
    return false; 
} 

nedeni annotate işlevini kullanmak, özel tür ve işlev imzaları için tür ipuçlarına izin vermektir. annotate olmadan sadece matches(someVar, "function") yapabilirsiniz. annotate ile matches(someVar, "function(string, ?int)|function(string)") yapabilir ve sadece bir dize ve bir null integer veya yalnızca bir dizeyi kabul eden işlevleri alan işlevleri kabul edebilirsiniz.

+0

Teşekkürler. Eşleşmeler() işlevi (takma adı kaynak kodunda __t), işlev türü denetimini yapmaktır. Ama bu soru, __w'nin amacını sormaktır. @SeanVieira – user1481096

+0

@ user1481096 - 'Annotate' hakkında daha fazla açıklama ekledim. Yardımcı olmak için başka bir şey yapabilirsem haber ver. –

+0

Statik değil (en azından bunun bir parçası değil), ancak güçlü dinamik yazım. –