在if条件中赋值时,对变量进行范围划分

时间:2018-11-23 23:11:49

标签: javascript

有没有办法确定在if语句的条件下分配的变量的作用域?

以下内容当然将el分配给我的元素,并且将在全局范围内(date也将)。

if (el = document.querySelector('.footer__year'), el) {
    var date = new Date();
    el.textContent = date.getFullYear();
}

但是要说我把它包裹在一个生物图中。

(function() {
    if (el = document.querySelector('.footer__year'), el) {
        var date = new Date();
        el.textContent = date.getFullYear();
    }
})();
仍然可以通过el访问

window.el,但是不能访问date

使用if (var el = document.querySelector('.footer__year'))会导致意外的令牌错误。

有没有办法确定范围?

此外,我知道以下内容可以解决我的问题。

(function() {
    var el = document.querySelector('.footer__year');
    if (el) {
        var date = new Date();
        el.textContent = date.getFullYear();
    }
})();

但是想知道是否有可能!

更新

这里不是整体变量作用域的问题(最后一个示例工作得很好,el不在全局范围内),它是在if语句的条件下声明与分配变量的能力。 / p>

2 个答案:

答案 0 :(得分:2)

if括号内的条件必须是一个表达式。 varconstlet声明是语句,这意味着您不能声明带有if条件的变量(即使您可以 assign 变量,因为赋值是一个表达式)。

您可以利用letconst的块作用域来避免IEFE:

var el = 100 // outside
{ let el = 5
  if (el === 5) {
        console.log("inside:", el)
  }
}
console.log("outside:", el)  // still outside

答案 1 :(得分:1)

简而言之,。您无法阻止if语句中的赋值全局挂起。

对此的一种解决方法(尽管可怕的一次仍然在全局范围内闪烁变量)将仅使用delete window[var],这将在使用后从global范围中删除变量。这是不明智的,如果您向老板展示,他们要么坚持要您接受更多培训,要么就派您去更绿色的牧场,但是结果或多或少都差不多。

(function() {
    if (el = document.querySelector('.footer__year'), el) {
        var date = new Date();
        el.textContent = date.getFullYear();
        delete window["el"];
    }
})();
console.log(el);
<div class="footer__year"></div>

执行上述操作有很多问题。最糟糕的是,您将在Global Scope中重写变量,然后将其删除,从而导致其余代码无法正常工作并引发错误,充其量您将无缘无故地执行更多操作,并使代码更少清楚地告诉其他人,因为实际上有一个无形的声明。老实说,这是最好且容易避免的一团糟。

TLDR; 否。使用适当的声明性语句和适当的关键字,并保持受雇/快乐。