函数中的Javascript if语句是否覆盖全局变量?
我试图创建一个静态导航面板,当到达页面内容的末尾时,它在页脚之前的底部变成绝对的 当我为wordpress开发页面时,页面可能会有不同的高度,因此我尝试在导航面板与页脚“碰撞”时触发绝对定位 到目前为止,我已经使用了我在这里找到的代码函数中的Javascript if语句是否覆盖全局变量?,javascript,jquery,html,css,wordpress,Javascript,Jquery,Html,Css,Wordpress,我试图创建一个静态导航面板,当到达页面内容的末尾时,它在页脚之前的底部变成绝对的 当我为wordpress开发页面时,页面可能会有不同的高度,因此我尝试在导航面板与页脚“碰撞”时触发绝对定位 到目前为止,我已经使用了我在这里找到的代码 function collision($archive, $footer){ var archivexPos = $archive.offset().left; var archiveyPos = $archive.offset().top;
function collision($archive, $footer){
var archivexPos = $archive.offset().left;
var archiveyPos = $archive.offset().top;
var archiveHeight = $archive.outerHeight(true);
var archiveWidth = $archive.outerWidth(true);
var archiveb = archiveyPos + archiveHeight;
var archiver = archivexPos + archiveWidth;
var footerxPos = $footer.offset().left;
var footeryPos = $footer.offset().top;
var footerHeight = $footer.outerHeight(true);
var footerWidth = $footer.outerWidth(true);
var footerb = footeryPos + footerHeight;
var footerr = footerxPos + footerWidth;
if (archiveb < footeryPos || archiveyPos > footerb || archiver < footerxPos || archivexPos > footer) return Boolean = false;
return Boolean = true;
我的问题是if语句似乎正在创建另一个布尔变量?当我注释它时,我可以看到控制台按照预期报告布尔变量。然而,当我把它放进去,它们碰撞时,就会发生这种情况
这里发生了什么?发生的主要事情是使用
=
进行比较。JavaScript使用的是=
(或=
),而不是=
<代码>=始终是分配
但是当测试布尔值时,您不希望==
或=代码>无论如何,只需直接使用布尔值:
if (flag) {
// It was true
} else {
// It was false
}
或者,如果您只是测试错误:
if (!flag) {
// flag was false
}
(请注意,由于JavaScript执行类型强制,这也适用于包含布尔值以外的值的变量:任何truthy值强制为true
,任何falsy值强制为false
。falsy值为0
,),NaN
,null
,未定义
,当然还有false
;所有其他值都是真实值。)
另外:Boolean
不是变量名的好选择,因为它是JavaScript标准库(函数)的一部分
此外,您当前的碰撞
函数执行两项操作:
它将Boolean
设置为true
或false
它返回它设置的值
一般来说,在所有其他条件相同的情况下,如果函数没有那样的副作用,那就最好了。如果调用方想将布尔值设置为函数的返回值,他/她可以,函数不需要这样做-它已经返回了值
最后:一般来说,全局变量是需要避免的。浏览器上的全局名称空间非常拥挤,很容易发生冲突(例如,名为name
的全局名称可能无法按预期工作,因为已经有了name
global[它是窗口的名称])。不,真正的问题是,您覆盖了布尔类型的构造函数
第一。坚持编码惯例:只有类以大写字母开头
第二。必须使用var
-关键字声明本地变量(对于块作用域变量,或let
,或const
)。
否则,引用周围范围中的变量;最后,是全球范围
三,。等号:
==
表示类型安全压缩
3 === 3 //=> true
3 === '3' //=>false
=
表示简单的比较
3 == '3' //=> also true now
var foo = 3;
=
表示赋值,而不是比较
3 == '3' //=> also true now
var foo = 3;
如果它包含在其他代码中,比如
var bar = 42 + (foo = 3);
//it works basically like
var bar = 42 + (function(){
foo = 3;
return 3; //NOT FOO!!! not even foo after the assignment
})();
//the same way, that this:
var bar = 42 + foo++;
//works basically like this:
var bar = 42 + (function(){
var result = foo;
foo = foo+1;
return result;
})();
如果(Boolean=false){
您不能赋值,只能进行比较。不,您真正的问题是,您覆盖了布尔类型的构造函数。完全疏忽。知道等于操作数,但显然意识不足,谢谢