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