对于一个小项目,我想创建一个基于引擎检测浏览器的小型库:
var engine = {
opera: function(){
var ua = navigator.userAgent.toLowerCase(),
version = ua.match(/opera[\/\s](\d+\.\d+)/);
if (version){
return parseFloat(version[1]);
}
},
webkit: function(){
var ua = navigator.userAgent.toLowerCase(),
version = ua.match(/applewebkit\/([\d.]+)/);
if (version && !engine.opera()){
return parseFloat(version[1]);
}
},
gecko: function(){
var ua = navigator.userAgent.toLowerCase(),
version = ua.match(/rv\:([\w\.]+).\s(gecko)/);
if (version && !engine.opera()){
return parseFloat(version[1]);
}
},
ie: function(){
var ua = navigator.userAgent.toLowerCase(),
version = ua.match(/msie (\d+\.\d+)/);
if (version && !engine.opera()){
return parseFloat(version[1]);
}
},
touch: function(){
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/android|ipod|iphone|ipad|iemobile|bb[\d]\d|blackberry|playbook|silk|touch|mobile/)){
return true;
}
else {
return false;
}
}
};
致电:engine.webkit()<534.3
,检查这是否是基于webkit的浏览器,而不是Android 4等中使用的浏览器。
如您所见,我使用属性赋值来封装引擎检测,而不是污染全局命名空间。
但是 - 对于每个单引擎,我都会创建变量 ua ,这显然不会被重复使用,因此不是最佳实践。
有人可以告诉我如何在引擎对象中定义 var ua 一次吗?
谢谢
答案 0 :(得分:2)
只需添加该属性,然后使用this
:
ua: navigator.userAgent.toLowerCase(),
opera: function {
this.ua // The reusable
答案 1 :(得分:1)
将其放在IIFE。
中var engine = (function() {
var ua = navigator.userAgent.toLowerCase();
return {
opera: function() { ... },
// etc.
};
})();
IIFE通过创建新的函数作用域来工作,该函数作用域将变量保留在全局作用域之外,然后立即执行该函数。 ua
实际上变成了私有变量。它是IIFE的局部变量,但可以由IIFE中定义的任何函数引用。