为什么parentCampaignId不在onClick方法的范围内?

时间:2019-06-12 10:07:27

标签: javascript

在此方法中,当我在while循环上方声明parentCampaignId时,不再可以在onClick方法中访问它。但是,如果我在while内声明,则可以在onClick方法内访问变量。这是为什么?为什么范围取决于while循环?

我问了我的同事和一位前辈。他们不知道。我也尝试使用Google搜索,但没有找到任何解决方案。

getBreadcrumbs() {
      let breadCrumbStack = [];
      let parentCampaign = this.getParentCampaign(this.props.campaign.get('parent_id'));
      while(typeof parentCampaign !== 'undefined') {
          let parentCampaignId = parentCampaign.get('campaign_id');
          breadCrumbStack.unshift({
              onClick: (() => {
                  window.location.href = '/cd/campaign/manage/campaign/'+parentCampaignId;  # Since parentCampaignId declared inside while it is accessible
              }).bind(this),
              label: parentCampaign.get('name')
          });
          parentCampaign = this.getParentCampaign(parentCampaign.get('parent_id'));
      }
      return breadCrumbStack;
  }
getBreadcrumbs() {
      let breadCrumbStack = [];
      let parentCampaign = this.getParentCampaign(this.props.campaign.get('parent_id'));
      let parentCampaignId = parentCampaign.get('campaign_id');
      while(typeof parentCampaign !== 'undefined') {
          breadCrumbStack.unshift({
              onClick: (() => {
                  window.location.href = '/cd/campaign/manage/campaign/'+parentCampaignId;  # Now parentCampaignId declared outside while and it is no longer accessible
              }).bind(this),
              label: parentCampaign.get('name')
          });
          parentCampaign = this.getParentCampaign(parentCampaign.get('parent_id'));
      }
      return breadCrumbStack;
  }

我希望在两种情况下都能正常工作,但在第二种情况下却无法工作(当parentCampaignId在while循环外部声明时)。

2 个答案:

答案 0 :(得分:0)

kubectl中,您定义一个函数,该函数使用变量 onClick,不是此函数的局部变量。 因此,JavaScript会接受该变量并放入 与函数一起放在一个闭包( google ::)中)。 在onClick函数被执行时, parentCampaignId充满了 变量window.location.href当时具有

现在,在您的第一个示例中,每次迭代都会创建一个新的parentCampaignId 变量(通过循环中的parentCampaignId关键字 ),然后将其包含在闭包中。 它最初获得了您期望的价值,并且从未改变。 因此,此let可以按预期工作。

但是,在第二个示例中,onClick被创建一次, 在循环之外。 parentCampaignId中只包含一个 每个parentCampaignId函数的关闭。 并且在执行onClick函数时 它们都将具有相同的onClick变量,其中包含 值parentCampaignId返回时的值。

答案 1 :(得分:0)

只是一个猜测。我猜您的第一个parentCampaignId是空的,并且在循环结束时您没有更新parentCampaignId,所以parentCampaignId永远都空着,您认为无法访问。

可以使用console.log来查看第一个parentCampaignId是什么吗?