ext/src/class/Loader.js文件中:
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] =[]; })();
转载于:https://blog.51cto.com/wangyuelucky/1603255