Class.registerPreprocessor('loader')
ext/src/class/Loader.jsファイル:は依存関係のキーワードを表し、コードは以下の通りである:
2.requiresMapはグローバルであり、依存関係名のキャッシュ、すなわち、ロードされたすべてのクラス名は、ここで登録され、重複ロードを防止し、依存ループがあります.
3.TODO:即時実行文ですか?
だから、まず後者を文に変えます.
に相当
今すぐ実行する方法で
Class.registerPreprocessor('loader', function(cls, data, hooks, continueFn) {
var me = this,
dependencies = [],
dependency,
className = Manager.getName(cls),
i, j, ln, subLn, value, propertyName, propertyValue,
requiredMap, requiredDep;
/**
*
*/
for (i = 0,ln = dependencyProperties.length; i < ln; i++) { // 1
propertyName = dependencyProperties[i];
if (data.hasOwnProperty(propertyName)) {
propertyValue = data[propertyName];
if (typeof propertyValue == 'string') {
dependencies.push(propertyValue);
}
else if (propertyValue instanceof Array) {
for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
value = propertyValue[j];
if (typeof value == 'string') {
dependencies.push(value);
}
}
}
else if (typeof propertyValue != 'function') {
for (j in propertyValue) {
if (propertyValue.hasOwnProperty(j)) {
value = propertyValue[j];
if (typeof value == 'string') {
dependencies.push(value);
}
}
}
}
}
}
if (dependencies.length === 0) {
return;
}
//<feature classSystem.loader>
//<debug error>
var deadlockPath = [],
detectDeadlock;
if (className) {
requiresMap[className] = dependencies; // 2
//<debug>
requiredMap = Loader.requiredByMap || (Loader.requiredByMap = {});
for (i = 0,ln = dependencies.length; i < ln; i++) {
dependency = dependencies[i];
(requiredMap[dependency] || (requiredMap[dependency] = [])).push(className); // 3
}
//</debug>
/**
*
*/
detectDeadlock = function(cls) {
deadlockPath.push(cls);
if (requiresMap[cls]) {
if (Ext.Array.contains(requiresMap[cls], className)) {
throw new Error("Deadlock detected while loading dependencies! '" + className + "' and '" +
deadlockPath[1] + "' " + "mutually require each other. Path: " +
deadlockPath.join(' -> ') + " -> " + deadlockPath[0]);
}
for (i = 0,ln = requiresMap[cls].length; i < ln; i++) {
detectDeadlock(requiresMap[cls][i]);
}
}
};
detectDeadlock(className);
}
//</debug>
//</feature>
/**
* Loader.require() wangyuelucky.blog.51cto.com/1011508/1594617
*/
Loader.require(dependencies, function() {
for (i = 0,ln = dependencyProperties.length; i < ln; i++) {
propertyName = dependencyProperties[i];
if (data.hasOwnProperty(propertyName)) {
propertyValue = data[propertyName];
if (typeof propertyValue == 'string') {
data[propertyName] = Manager.get(propertyValue);
}
else if (propertyValue instanceof Array) {
for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
value = propertyValue[j];
if (typeof value == 'string') {
data[propertyName][j] = Manager.get(value);
}
}
}
else if (typeof propertyValue != 'function') {
for (var k in propertyValue) {
if (propertyValue.hasOwnProperty(k)) {
value = propertyValue[k];
if (typeof value == 'string') {
data[propertyName][k] = Manager.get(value);
}
}
}
}
}
}
continueFn.call(me, cls, data, hooks);
});
return false;
}, true, 'after', 'className');
dependencyProperties = ['extend', 'mixins', 'requires']
2.requiresMapはグローバルであり、依存関係名のキャッシュ、すなわち、ロードされたすべてのクラス名は、ここで登録され、重複ロードを防止し、依存ループがあります.
3.TODO:即時実行文ですか?
requiredMap[dependency] || requiredMap[dependency] = [] // , true = [];
obj[url] || obj[url] = []
obj[url] || obj[url] = [] sd
だから、まず後者を文に変えます.
requiredMap[dependency] || (requiredMap[dependency] = []) //
に相当
if(!requiredMap[dependency]) requiredMap[dependency] =[]; //
今すぐ実行する方法で
requiredMap[dependency] = (function(){
if(!requiredMap[dependency]) requiredMap[dependency] =[];
})();