JS的for循环中的var 和 let

在js的嵌套for循环异步执行,声明 i 和 使用 i 获取到的变量 都要用 let 声明,不要用var。

除非封装一个函数,把参数传进去调用,才能避免var使用最后一个变量,没必要。

  1. 同步 vs 异步:

    • Java.perform 本身是同步执行的。它会立即执行传递给它的函数。
    • Java.perform 内部,你为每个 Utils 类的方法重写了实现。这些重写的实现(implementation 函数)是在目标应用调用这些方法时被异步触发的。
  2. 变量作用域:

    • 使用 let 声明 methodName 确保了每次迭代中 methodName 都是一个新的绑定。
    • 使用 var 声明 methodName 会导致所有闭包共享同一个变量,这在方法重写中可能导致意想不到的结果。
  3. 异步触发:

    • 虽然重写的方法实现是同步定义的,但实际调用这些方法(即执行重写的实现)是异步触发的,取决于目标应用何时调用这些方法。

Java.perform(function () {
    let Utils = Java.use("com.xxx.xxx.Utils");
    var methods = Utils.class.getDeclaredMethods();
    for (let i = 0; i < methods.length; i++) {
        let methodName = methods[i].getName();
        console.log('methodName: ', methodName)
        var overloadsArray = Utils[methodName].overloads;
        for (let j = 0; j < overloadsArray.length; j++) {
            overloadsArray[j].implementation = function () {
                var params = '';
                for (let k = 0; k < arguments.length; k++) {
                    params += arguments[k] + ' ';
                }
                console.log(`utils.${methodName} is called! params is: `, params);
                console.log(this);
                return this[methodName].apply(this, arguments)
            }
        }
    }
})

虽然 Java.perform 内的代码是同步执行的,但方法重写的实现会在目标应用调用这些方法时被异步触发。因此,使用 let 确保了变量作用域的正确性,避免了变量共享问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值