寻找正确的Javascript IIFE模式

时间:2014-06-03 20:33:06

标签: javascript

我在一个大型代码库中工作并遇到了这个文件,其中包含以下内容:

window.hasTouch = (function() {
    // will return 'true' if user is visiting with a touch-capable device
    return ('ontouchstart' in document.documentElement);
});

然后在另一个文件中以下列方式调用window.hasTouch:

hasTouch = window.hasTouch();

我的问题是,有时在控制台中,用()调用它会返回错误:

TypeError: boolean is not a function

然后当我按照" hasTouch = window.hasTouch" (parens省略),它像我想要的那样返回true / false。

有人可以在此设置中澄清一下调用window.hasTouch的理想方式吗?

2 个答案:

答案 0 :(得分:1)

通过全局分配hasTouch,您会覆盖window.hasTouch,以便该功能丢失。如果您想避免这种情况,请在函数内使用var hasTouch = ...

此外,您的代码不是IIFE - 您只需将功能分配给window.hasTouch。在函数定义之后,IIFE将()立即调用它并指定其返回值。

答案 1 :(得分:0)

如果您希望window.hasTouch成为bool而不是函数,您只需执行以下操作:

window.hasTouch = 'ontouchstart' in document.documentElement;

否则,您可以立即评估匿名函数:

window.hasTouch = (function() {
    // will return 'true' if user is visiting with a touch-capable device
    return ('ontouchstart' in document.documentElement);
})(); // <-- note the extra parens