JavaScript,为什么此处没有异步也需要用闭包

题目描述

批量改造Page的原型对象中的方法
所有post开头的方法添加拦截验证功能
当原型链中的check方法返回true时继续执行
否则不执行

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

function checkfy(obj) {
  // 遍历所有键
  for(var key in obj) {
    // 寻找post开头并且是函数的键值
    if (key.indexOf('post')==0 && typeof obj[key] == 'function') {
      // 此处要使用闭包,虽然我也不知道为什么不用闭包的话只会修改最后一个key。。
      (function(key) {
        var func = obj[key]
        obj[key] = function() {
          var check = obj.check()
          if (check) {
            func.apply(obj, arguments)
          }
        }
      }(key))
    }
  }
}

你期待的结果是什么?实际看到的错误信息又是什么?

答案代码中修改原型链中的方法是用了for语句然后使用了闭包来修改,我不太明白为什么要使用闭包(自己尝试了去掉匿名函数,发现确实只有最后一个key的方法被修改了),求解答

阅读 2.3k
3 个回答

没有匿名函数,所有的 var func 都是同一个变量,它会被反复覆盖。

有匿名函数,才能为每一个 key 建立一个 var func

因为js里,for循环不算块作用域,所以obj[key]定义的所有方法里,func为obj["the last key"]的方法,而不是每个属性的方法。
你可以把立即执行去掉,var替换为let也可以

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题