ijavascript。函数调用作为三元运算符中的条件。奇怪的行为

ijavascript。函数调用作为三元运算符中的条件。奇怪的行为,javascript,function,call,operator-keyword,ternary,Javascript,Function,Call,Operator Keyword,Ternary,我想不出是怎么回事 const toggleKls = ()=> isKls() ? ls.setItem(kls, "false") : ls.setItem(kls, "true"); toggleKls()无法按预期工作, 我甚至尝试切换exprIfTrue和exprIfFalse的位置,但是window.localStorage.getItem(kls)与启动时保持不变 isKls()也不起作用, 由于某种原因,它的计算结果总是true 当

我想不出是怎么回事

const toggleKls = ()=> isKls() ? ls.setItem(kls, "false") : ls.setItem(kls, "true");
toggleKls()
无法按预期工作, 我甚至尝试切换
exprIfTrue
exprIfFalse
的位置,但是
window.localStorage.getItem(kls)
与启动时保持不变

isKls()
也不起作用, 由于某种原因,它的计算结果总是
true

当我这样测试这个表达式时

testo = (r)=>r
testo(true) ? false : true
//false
testo(false) ? false : true
//true
它工作得很好,看起来我在做下面同样的事情,但显然不是,我不明白为什么

//<FOR DEVELOPMENT
const ls = window.localStorage;
const kls = "keyListenSwitch";
const isKls = ()=> ls.getItem(kls);

console.warn(`kls: ${isKls()} test: ${ls.getItem("test")} kls by hand: ${window.localStorage.getItem(kls)}`)
const toggleKls = ()=> isKls() ? ls.setItem(kls, "false") : ls.setItem(kls, "true");

//get any key if switch is on
document.body.addEventListener(
    'keydown',
    gHandler( 
        e=> isKls(),
        e=> console.log(`event: ctrl:${e.ctrlKey} alt:${e.altKey} shift:${e.shiftKey} key:${e.keyCode}\nkls: ${isKls()}`),
        500),
    false);

//toggle switch to get any key
document.body.addEventListener(
    'keydown',
    gHandler( 
        e=> e.ctrlKey && e.altKey && e.keyCode == 76,//l
        ()=>{ 
            toggleKls();
            console.warn(`TOGGLE Dev:\nListen To Any Key Switch is: ${ isKls() ? "ON" : "OFF"}`);
        },
        500),
    false);

//>for development
//>bindings
这个函数实际上是在其他函数之上声明的,但我把它放在这里只是为了更清楚

//TOOLS
function gHandler (ruler,action,cd){//cool down
    let lcd = 0;
    let iscd = ()=>{ 
        let t = new Date().getTime();
        let tmp = t - lcd; 
        return lcd = t, tmp >= cd}

    return function (e) {
        if (ruler(e) && iscd()) {
            action(e);
        }
    }
}
//tools

这条线似乎有点可疑

const isKls = ()=> ls.getItem(kls);

问题是
localStorage.getItem(key)
返回字符串值<代码>“true”==true将导致false。你必须评估那件事或者改变条件。与
“false”

toggleKls()的情况相同,它无法按预期工作,请尝试将其缩小到可运行状态,以演示您的问题。问题在于,您不知道所有函数调用都将执行,而不管条件结果如何。函数首先运行,然后使用这些函数调用的返回值执行条件。如果
getItem(kls)
返回一个本身有返回值的函数,则该行就可以了。
const isKls = ()=> ls.getItem(kls);