JS函数名称干扰对象属性

时间:2016-01-25 14:01:35

标签: javascript function scroll reference

我正在尝试构建一个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;
}

2 个答案:

答案 0 :(得分:2)

是的,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;
}

答案 1 :(得分:1)

我实际上是通过将pageXOffset函数重命名为pXOffset来实现的。

pageXOffset实际上干扰了self.pageXOffset