我正在尝试构建一个polyfill以获取实际的滚动位置。

function getScLPos() {
    if (self.pageXOffset) return self.pageXOffset;
    if (document.documentElement && document.documentElement.scrollLeft)
        return document.documentElement.scrollLeft;
    if (document.body.scrollLeft) return document.body.scrollLeft;
    return 0;
}


但是,随着每个函数调用都经过相同的条件检查过程。
我想通过在第一次调用全局变量时将函数引用分配给全局变量来优化函数。之后,它读取全局变量(包含函数)并执行该函数,但实际上不起作用。当我调用getScLPos()时,它仍然返回一个函数。

如何使getScLPos返回整数值?

编辑:typeof pageXOffset()说“功能”。

var getScLCallback = null;

function getScLPos() {

    if (getScLCallback != null) {
        return getScLCallback();
    } else {
        if (self.pageXOffset) {
            getScLCallback = pageXOffset;

            //says "function() {...}"
            console.log(getScLCallback());

            return getScLCallback();
        } else if { ... }
        } else {
            return 0;
        }
    }
}

function pageXOffset() {
    return self.pageXOffset;
}

最佳答案

是的,JavaScript中存在函数引用。函数只是对象。您做错了的是将函数的结果分配给变量,而不是分配函数本身。要将函数分配给变量,只需使用函数名,末尾没有()

因此,代替:

getScLCallback = docScrollLeft();


做这个:

getScLCallback = docScrollLeft;


这是您更新的代码:

var getScLCallback = null;

function getScLPos() {

    if (getScLCallback != null) {
        return getScLCallback();
    } else {
        if (self.pageXOffset) {
            // REMOVED the parentheses
            getScLCallback = pageXOffset;

            //says "function() {...}"
            console.log(getScLCallback());

            return getScLCallback();
        } else if (document.documentElement && document.documentElement.scrollLeft) {
            // REMOVED the parentheses
            getScLCallback = docScrollLeft;
            return getScLCallback();
        } else if (document.body.scrollLeft) {
            // REMOVED the parentheses
            getScLCallback = bodyScrollLeft;
            return getScLCallback();
        } else {
            return 0;
        }
    }
}

function pageXOffset() {
    return self.pageXOffset;
}
function docScrollLeft() {
    return document.documentElement.scrollLeft;
}
function bodyScrollLeft() {
    return document.body.scrollLeft;
}

10-07 19:04
查看更多