函数中的Javascript if语句是否覆盖全局变量?

函数中的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;

我试图创建一个静态导航面板,当到达页面内容的末尾时,它在页脚之前的底部变成绝对的

当我为wordpress开发页面时,页面可能会有不同的高度,因此我尝试在导航面板与页脚“碰撞”时触发绝对定位

到目前为止,我已经使用了我在这里找到的代码

 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){
    您不能赋值,只能进行比较。不,您真正的问题是,您覆盖了布尔类型的构造函数。完全疏忽。知道等于操作数,但显然意识不足,谢谢