B2B网络软件
标题:
安卓脚本多变的function用法
[打印本页]
作者:
YYPOST群发软件
时间:
2 小时前
标题:
安卓脚本多变的function用法
安卓脚本多变的function用法
2.png
(668.95 KB, 下载次数: 0)
下载附件
2 小时前
上传
//🍎交流QQ群711841924群一,苹果内测群,528816639
/**
* =============================================================================
* AIWROK 高级函数封装库 - 实用案例集
* =============================================================================
* 本文件展示更复杂、多变的 function 用法,包括:
* 1. 闭包与私有变量
* 2. 高阶函数与函数组合
* 3. 递归与记忆化
* 4. 工厂模式与构造函数
* 5. 异步处理与回调
* 6. 装饰器模式
* 7. 观察者模式
* 8. 链式调用
*/
// =============================================================================
// 1. 闭包与私有变量 - 创建安全的计数器
// =============================================================================
/**
* 创建安全计数器(使用闭包保护内部状态)
* @returns {Object} 计数器对象
*/
function createSecureCounter() {
var count = 0; // 私有变量
return {
increment: function() {
count++;
console.log('计数器增加: ' + count);
return count;
},
decrement: function() {
if (count > 0) {
count--;
console.log('计数器减少: ' + count);
} else {
console.log('计数器已为最小值');
}
return count;
},
getCount: function() {
return count;
},
reset: function() {
count = 0;
console.log('计数器重置');
return count;
}
};
}
// =============================================================================
// 2. 高阶函数 - 函数作为参数和返回值
// =============================================================================
/**
* 通用重试机制(高阶函数)
* @param {Function} fn - 要执行的函数
* @param {number} maxRetries - 最大重试次数
* @param {number} delay - 重试间隔(毫秒)
* @returns {*} 函数执行结果
*/
function withRetry(fn, maxRetries, delay) {
var attempts = 0;
function execute() {
attempts++;
try {
console.log('尝试执行第 ' + attempts + ' 次...');
var result = fn();
console.log('执行成功!');
return result;
} catch (e) {
console.log('执行失败: ' + e.message);
if (attempts < maxRetries) {
console.log(delay + 'ms 后重试...');
Sleeper.millisecond(delay);
return execute();
} else {
throw new Error('达到最大重试次数: ' + maxRetries);
}
}
}
return execute();
}
/**
* 函数组合器(类似数学中的 f(g(x)))
* @param {...Function} functions - 要组合的函数列表
* @returns {Function} 组合后的函数
*/
function compose() {
var funcs = Array.prototype.slice.call(arguments);
return function(value) {
var result = value;
for (var i = funcs.length - 1; i >= 0; i--) {
result = funcs[i](result);
}
return result;
};
}
/**
* 管道函数(从左到右执行)
* @param {...Function} functions - 要管道的函数列表
* @returns {Function} 管道后的函数
*/
function pipe() {
var funcs = Array.prototype.slice.call(arguments);
return function(value) {
var result = value;
for (var i = 0; i < funcs.length; i++) {
result = funcs[i](result);
}
return result;
};
}
// =============================================================================
// 3. 递归与记忆化 - 优化重复计算
// =============================================================================
/**
* 带记忆化的斐波那契数列计算
* @param {number} n - 第n个斐波那契数
* @returns {number} 斐波那契数值
*/
function fibonacciMemoized() {
var cache = {}; // 缓存对象
function fib(n) {
if (n in cache) {
return cache[n];
}
if (n <= 1) {
return n;
}
cache[n] = fib(n - 1) + fib(n - 2);
return cache[n];
}
return fib;
}
/**
* 递归目录遍历(模拟)
* @param {string} path - 路径
* @param {number} depth - 当前深度
* @param {number} maxDepth - 最大深度
*/
function traverseDirectory(path, depth, maxDepth) {
if (depth > maxDepth) {
return;
}
console.log(' '.repeat(depth) + '├── ' + path);
// 模拟子目录
var subDirs = ['docs', 'src', 'config'];
for (var i = 0; i < subDirs.length; i++) {
traverseDirectory(path + '/' + subDirs[i], depth + 1, maxDepth);
}
}
// =============================================================================
// 4. 工厂模式 - 动态创建对象
// =============================================================================
/**
* UI组件工厂
* @returns {Object} 组件工厂对象
*/
function createUIFactory() {
var components = {};
return {
/**
* 注册组件模板
* @param {string} name - 组件名称
* @param {Function} template - 组件模板函数
*/
register: function(name, template) {
components[name] = template;
console.log('组件 [' + name + '] 已注册');
},
/**
* 创建组件实例
* @param {string} name - 组件名称
* @param {Object} options - 配置选项
* @returns {Object} 组件实例
*/
create: function(name, options) {
if (!components[name]) {
throw new Error('未找到组件: ' + name);
}
console.log('创建组件 [' + name + ']');
return components[name](options);
},
/**
* 获取所有已注册组件
* @returns {Array} 组件名称列表
*/
getRegisteredComponents: function() {
return Object.keys(components);
}
};
}
/**
* 按钮组件模板
* @param {Object} options - 配置选项
* @returns {Object} 按钮对象
*/
function buttonTemplate(options) {
return {
type: 'button',
text: options.text || '按钮',
onClick: options.onClick || function() {},
render: function() {
console.log('[按钮] ' + this.text);
}
};
}
/**
* 输入框组件模板
* @param {Object} options - 配置选项
* @returns {Object} 输入框对象
*/
function inputTemplate(options) {
return {
type: 'input',
placeholder: options.placeholder || '请输入...',
value: '',
onChange: options.onChange || function() {},
render: function() {
console.log('[输入框] 占位符: ' + this.placeholder);
}
};
}
// =============================================================================
// 5. 异步处理 - 模拟异步操作
// =============================================================================
/**
* 异步任务管理器
* @returns {Object} 任务管理器
*/
function createAsyncManager() {
var tasks = [];
var isRunning = false;
return {
/**
* 添加任务
* @param {Function} task - 任务函数
* @param {string} name - 任务名称
*/
addTask: function(task, name) {
tasks.push({
func: task,
name: name || ('Task_' + tasks.length),
status: 'pending'
});
console.log('任务 [' + name + '] 已添加');
},
/**
* 顺序执行所有任务
*/
runSequentially: function() {
if (isRunning) {
console.log('任务正在运行中...');
return;
}
isRunning = true;
console.log('========== 开始顺序执行任务 ==========');
for (var i = 0; i < tasks.length; i++) {
var task = tasks[i];
console.log('执行任务 [' + task.name + '] (' + (i + 1) + '/' + tasks.length + ')');
try {
task.func();
task.status = 'completed';
console.log('✓ 任务 [' + task.name + '] 完成');
} catch (e) {
task.status = 'failed';
console.log('✗ 任务 [' + task.name + '] 失败: ' + e.message);
}
Sleeper.millisecond(500); // 模拟延迟
}
isRunning = false;
console.log('========== 所有任务执行完毕 ==========');
},
/**
* 获取任务状态
* @returns {Array} 任务状态列表
*/
getStatus: function() {
return tasks.map(function(task) {
return {
name: task.name,
status: task.status
};
});
}
};
}
// =============================================================================
// 6. 装饰器模式 - 增强函数功能
// =============================================================================
/**
* 日志装饰器
* @param {Function} fn - 原函数
* @param {string} name - 函数名称
* @returns {Function} 装饰后的函数
*/
function withLogging(fn, name) {
return function() {
console.log('>>> 调用函数: ' + name);
console.log(' 参数: ' + JSON.stringify(Array.prototype.slice.call(arguments)));
var start = new Date().getTime();
var result = fn.apply(this, arguments);
var duration = new Date().getTime() - start;
console.log('<<< 函数 ' + name + ' 执行完成,耗时: ' + duration + 'ms');
console.log(' 返回值: ' + JSON.stringify(result));
return result;
};
}
/**
* 缓存装饰器
* @param {Function} fn - 原函数
* @returns {Function} 带缓存的函数
*/
function withCaching(fn) {
var cache = {};
return function() {
var key = JSON.stringify(Array.prototype.slice.call(arguments));
if (key in cache) {
console.log('命中缓存: ' + key);
return cache[key];
}
console.log('计算并缓存: ' + key);
var result = fn.apply(this, arguments);
cache[key] = result;
return result;
};
}
/**
* 节流装饰器
* @param {Function} fn - 原函数
* @param {number} delay - 延迟时间(毫秒)
* @returns {Function} 节流后的函数
*/
function throttle(fn, delay) {
var lastCall = 0;
return function() {
var now = new Date().getTime();
if (now - lastCall >= delay) {
lastCall = now;
return fn.apply(this, arguments);
} else {
console.log('节流: 忽略调用');
}
};
}
// =============================================================================
// 7. 观察者模式 - 事件系统
// =============================================================================
/**
* 创建事件总线
* @returns {Object} 事件总线对象
*/
function createEventBus() {
var listeners = {};
return {
/**
* 订阅事件
* @param {string} event - 事件名称
* @param {Function} callback - 回调函数
*/
on: function(event, callback) {
if (!listeners[event]) {
listeners[event] = [];
}
listeners[event].push(callback);
console.log('订阅事件: ' + event);
},
/**
* 取消订阅
* @param {string} event - 事件名称
* @param {Function} callback - 回调函数
*/
off: function(event, callback) {
if (!listeners[event]) return;
var index = listeners[event].indexOf(callback);
if (index > -1) {
listeners[event].splice(index, 1);
console.log('取消订阅事件: ' + event);
}
},
/**
* 发布事件
* @param {string} event - 事件名称
* @param {*} data - 事件数据
*/
emit: function(event, data) {
if (!listeners[event]) {
console.log('无监听者: ' + event);
return;
}
console.log('发布事件: ' + event);
listeners[event].forEach(function(callback) {
try {
callback(data);
} catch (e) {
console.log('事件回调错误: ' + e.message);
}
});
},
/**
* 一次性订阅
* @param {string} event - 事件名称
* @param {Function} callback - 回调函数
*/
once: function(event, callback) {
var self = this;
var wrapper = function(data) {
callback(data);
self.off(event, wrapper);
};
this.on(event, wrapper);
}
};
}
// =============================================================================
// 8. 链式调用 - 流畅API
// =============================================================================
/**
* 创建字符串处理器(支持链式调用)
* @param {string} str - 初始字符串
* @returns {Object} 处理器对象
*/
function createStringProcessor(str) {
var value = str || '';
return {
/**
* 转大写
* @returns {Object} 自身(支持链式调用)
*/
toUpperCase: function() {
value = value.toUpperCase();
return this;
},
/**
* 转小写
* @returns {Object} 自身
*/
toLowerCase: function() {
value = value.toLowerCase();
return this;
},
/**
* 去除空格
* @returns {Object} 自身
*/
trim: function() {
value = value.trim();
return this;
},
/**
* 替换文本
* @param {string} search - 搜索文本
* @param {string} replace - 替换文本
* @returns {Object} 自身
*/
replace: function(search, replace) {
value = value.replace(new RegExp(search, 'g'), replace);
return this;
},
/**
* 追加文本
* @param {string} text - 追加文本
* @returns {Object} 自身
*/
append: function(text) {
value += text;
return this;
},
/**
* prepend 文本
* @param {string} text - 前置文本
* @returns {Object} 自身
*/
prepend: function(text) {
value = text + value;
return this;
},
/**
* 获取结果
* @returns {string} 处理后的字符串
*/
getResult: function() {
return value;
},
/**
* 打印结果
* @returns {Object} 自身
*/
log: function() {
console.log('当前值: "' + value + '"');
return this;
}
};
}
// =============================================================================
// 工具函数
// =============================================================================
/**
* 延迟工具函数
*/
var Sleeper = {
millisecond: function(ms) {
var start = new Date().getTime();
while (new Date().getTime() - start < ms) {
// 等待
}
},
second: function(seconds) {
this.millisecond(seconds * 1000);
}
};
/**
* 倒计时显示函数
* @param {number} seconds - 倒计时秒数
* @param {string} prefix - 前缀文本
*/
function countdown(seconds, prefix) {
prefix = prefix || '等待';
for (var i = seconds; i > 0; i--) {
console.log(prefix + '... ' + i + '秒');
Sleeper.second(1);
}
console.log(prefix + '... 开始!');
Sleeper.millisecond(500); // 短暂停顿
}
// =============================================================================
// 演示函数
// =============================================================================
/**
* 演示1: 闭包计数器
*/
function demoClosure() {
countdown(2, '【演示1】即将开始');
console.log('========== 演示1: 闭包计数器 ==========');
var counter = createSecureCounter();
counter.increment();
counter.increment();
counter.increment();
console.log('当前计数: ' + counter.getCount());
counter.decrement();
counter.reset();
console.log('');
}
/**
* 演示2: 高阶函数
*/
function demoHigherOrder() {
countdown(2, '【演示2】即将开始');
console.log('========== 演示2: 高阶函数 ==========');
// 重试机制
var successCount = 0;
var retryResult = withRetry(function() {
successCount++;
if (successCount < 3) {
throw new Error('模拟失败');
}
return '成功!';
}, 5, 100);
console.log('重试结果: ' + retryResult);
// 函数组合
var addOne = function(x) { return x + 1; };
var multiplyTwo = function(x) { return x * 2; };
var composed = compose(multiplyTwo, addOne);
console.log('组合函数结果 (先+1再*2): ' + composed(5)); // (5+1)*2 = 12
// 管道
var piped = pipe(addOne, multiplyTwo);
console.log('管道函数结果 (先+1再*2): ' + piped(5)); // (5+1)*2 = 12
console.log('');
}
/**
* 演示3: 递归与记忆化
*/
function demoRecursion() {
countdown(2, '【演示3】即将开始');
console.log('========== 演示3: 递归与记忆化 ==========');
var fib = fibonacciMemoized();
console.log('斐波那契数列前10项:');
for (var i = 0; i < 10; i++) {
console.log(' F(' + i + ') = ' + fib(i));
}
console.log('\n目录遍历示例:');
traverseDirectory('root', 0, 2);
console.log('');
}
/**
* 演示4: 工厂模式
*/
function demoFactory() {
countdown(2, '【演示4】即将开始');
console.log('========== 演示4: 工厂模式 ==========');
var factory = createUIFactory();
factory.register('button', buttonTemplate);
factory.register('input', inputTemplate);
var btn = factory.create('button', {
text: '提交',
onClick: function() { console.log('按钮被点击'); }
});
btn.render();
var inp = factory.create('input', {
placeholder: '请输入用户名'
});
inp.render();
console.log('已注册组件: ' + factory.getRegisteredComponents().join(', '));
console.log('');
}
/**
* 演示5: 异步任务管理
*/
function demoAsync() {
countdown(2, '【演示5】即将开始');
console.log('========== 演示5: 异步任务管理 ==========');
var manager = createAsyncManager();
manager.addTask(function() {
console.log(' 任务1: 初始化数据');
}, '初始化');
manager.addTask(function() {
console.log(' 任务2: 加载配置');
}, '加载配置');
manager.addTask(function() {
console.log(' 任务3: 连接服务器');
}, '连接服务器');
manager.runSequentially();
var status = manager.getStatus();
console.log('任务状态:');
status.forEach(function(s) {
console.log(' ' + s.name + ': ' + s.status);
});
console.log('');
}
/**
* 演示6: 装饰器模式
*/
function demoDecorator() {
countdown(2, '【演示6】即将开始');
console.log('========== 演示6: 装饰器模式 ==========');
// 日志装饰
var originalFunc = function(a, b) {
return a + b;
};
var loggedFunc = withLogging(originalFunc, '加法函数');
var result = loggedFunc(10, 20);
console.log('结果: ' + result);
// 缓存装饰
var expensiveCalc = function(n) {
Sleeper.millisecond(100); // 模拟耗时计算
return n * n;
};
var cachedCalc = withCaching(expensiveCalc);
console.log('第一次调用:');
cachedCalc(5);
console.log('第二次调用(应命中缓存):');
cachedCalc(5);
console.log('');
}
/**
* 演示7: 观察者模式
*/
function demoObserver() {
countdown(2, '【演示7】即将开始');
console.log('========== 演示7: 观察者模式 ==========');
var bus = createEventBus();
// 订阅事件
bus.on('dataUpdate', function(data) {
console.log(' 监听者1收到数据: ' + JSON.stringify(data));
});
bus.on('dataUpdate', function(data) {
console.log(' 监听者2收到数据: ' + JSON.stringify(data));
});
// 一次性订阅
bus.once('onceEvent', function(data) {
console.log(' 一次性监听者收到: ' + data);
});
// 发布事件
bus.emit('dataUpdate', { value: 100, timestamp: new Date().getTime() });
bus.emit('onceEvent', '测试数据');
bus.emit('onceEvent', '再次触发(应该无响应)');
console.log('');
}
/**
* 演示8: 链式调用
*/
function demoChaining() {
countdown(2, '【演示8】即将开始');
console.log('========== 演示8: 链式调用 ==========');
var result = createStringProcessor(' hello world ')
.trim()
.toUpperCase()
.replace('WORLD', 'AIWROK')
.append(' - 欢迎使用')
.prepend('【')
.append('】')
.log()
.getResult();
console.log('最终结果: ' + result);
console.log('');
}
/**
* 主函数 - 运行所有演示
*/
function main() {
console.log('========================================');
console.log(' AIWROK 高级函数封装库 - 实用案例集');
console.log('========================================');
console.log('');
countdown(2, '程序启动');
demoClosure();
demoHigherOrder();
demoRecursion();
demoFactory();
demoAsync();
demoDecorator();
demoObserver();
demoChaining();
console.log('========================================');
console.log(' 所有演示已完成!');
console.log('========================================');
}
// 执行主函数
main();
复制代码
欢迎光临 B2B网络软件 (http://bbs.niubt.cn/)
Powered by Discuz! X3.2