有没有办法确定在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>
答案 0 :(得分:2)
if
括号内的条件必须是一个表达式。 var
,const
和let
声明是语句,这意味着您不能声明带有if
条件的变量(即使您可以 assign 变量,因为赋值是一个表达式)。
您可以利用let
或const
的块作用域来避免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; 否。使用适当的声明性语句和适当的关键字,并保持受雇/快乐。