我记得数年前,只要我们编写JavaScript,都必须用到几个常用的函数,比如,addEventListener 和 attachEvent,并不是为了很超前的技术和功能,只是一些基本的任务,原因是各种浏览器之间的差异造成的。时间过去了这么久,技术在不断的进步,仍然有一些JavaScript函数是几乎所有Web程序员必备的,或为了性能,或为了功能。

防止高频调用的debounce函数

这个 debounce 函数对于那些执行事件驱动的任务来说是必不可少的提高性能的函数。如果你在使用scrollresizekey*等事件触发执行任务时不使用降频函数,也行你就犯了重大的错误。下面这个降频函数 debounce 能让你的代码变的高效:

// 返回一个函数,that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {var timeout;return function() {var context = this, args = arguments;var later = function() {timeout = null;if (!immediate) func.apply(context, args);};var callNow = immediate && !timeout;clearTimeout(timeout);timeout = setTimeout(later, wait);if (callNow) func.apply(context, args);};
};// Usage
var myEfficientFn = debounce(function() {// All the taxing stuff you do
}, 250);
window.addEventListener('resize', myEfficientFn);

这个 debounce 函数在给定的时间间隔内只允许你提供的回调函数执行一次,以此降低它的执行频率。当遇到高频触发的事件时,这样的限制显得尤为重要。

设定时间/频率循环检测函数

上面提到的 debounce 函数是借助于某个事件的触发。但有时候并没有这样的事件可用,那我们只能自己写一个函数来每隔一段时间检查一次。

function poll (fn, callback, err, timeout, interval) {var startTime = (new Date()).getTime();var pi = window.setInterval(function(){if (Math.floor(((new Date).getTime() - startTime) / 1000) <= timeout) {if (fn()) {callback();}} else {window.clearInterval(pi);err();}}, interval)
}

禁止重复调用、只允许执行一次的once 函数

很多时候,我们只希望某种动作只能执行一次,就像是我们使用 onload来限定只在加载完成时执行一次。下面这个函数就能让你的操作执行一次后就不会再重复执行。

function once(fn, context) { var result;return function() { if(fn) {result = fn.apply(context || this, arguments);fn = null;}return result;};
}// Usage
var canOnlyFireOnce = once(function() {console.log('Fired!');
});canOnlyFireOnce(); // "Fired!"
canOnlyFireOnce(); // nada

这个 once 函数能够保证你提供的函数只执行唯一的一次,防止重复执行。

获取一个链接的绝对地址 getAbsoluteUrl

获取链接的绝对地址并不像你想象的那么简单。下面就是一个非常实用的函数,能根据你输入的相对地址,获取绝对地址:

var getAbsoluteUrl = (function() {var a;return function(url) {if(!a) a = document.createElement('a');a.href = url;return a.href;};
})();// Usage
getAbsoluteUrl('/something'); // http://www.webhek.com/something

这里使用了 a 标签 href 来生成完整的绝对URL,十分的可靠。

判断一个JavaScript函数是否是系统原生函数 isNative

很多第三方js脚本都会在全局变量里引入新的函数,有些甚至会覆盖掉系统的原生函数,下面这个方法就是来检查是不是原生函数的:

;(function() {// Used to resolve the internal `[[Class]]` of valuesvar toString = Object.prototype.toString;// Used to resolve the decompiled source of functionsvar fnToString = Function.prototype.toString;// Used to detect host constructors (Safari > 4; really typed array specific)var reHostCtor = /^\[object .+?Constructor\]$/;// Compile a regexp using a common native method as a template.// We chose `Object#toString` because there's a good chance it is not being mucked with.var reNative = RegExp('^' +// Coerce `Object#toString` to a stringString(toString)// Escape any special regexp characters.replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')// Replace mentions of `toString` with `.*?` to keep the template generic.// Replace thing like `for ...` to support environments like Rhino which add extra info// such as method arity..replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');function isNative(value) {var type = typeof value;return type == 'function'// Use `Function#toString` to bypass the value's own `toString` method// and avoid being faked out.? reNative.test(fnToString.call(value))// Fallback to a host object check because some environments will represent// things like typed arrays as DOM methods which may not conform to the// normal native pattern.: (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;}// export however you wantmodule.exports = isNative;
}());// Usage
isNative(alert); // true
isNative(myCustomFunction); // false

这个方法虽然不是那么的简洁,但还是可以完成任务的!

用JavaScript创建新的CSS规则 insertRule

有时候我们会使用一个CSS选择器(比如 document.querySelectorAll)来获取一个 NodeList ,然后给它们每个依次修改样式。其实这并不是一种高效的做法,高效的做法是用JavaScript新建一段CSS样式规则:

// Build a better Sheet object
Sheet = (function() {// Build stylevar style = document.createElement('style');style.setAttribute('media', 'screen');style.appendChild(document.createTextNode(''));document.head.appendChild(style);// Build and return a single functionreturn function(rule){ style.sheet.insertRule( rule, style.sheet.cssRules.length ); } ;
})();// Then call as a function
Sheet(".stats { position: relative ; top: 0px }") ;

这些做法的效率非常高,在一些场景中,比如使用ajax新加载一段html时,使用上面这个方法,你不需要操作新加载的html内容。

判断网页元素是否具有某种属性和样式 matchesSelector

function matchesSelector(el, selector) {var p = Element.prototype;var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function(s) {return [].indexOf.call(document.querySelectorAll(s), this) !== -1;};return f.call(el, selector);
}// Usage
matchesSelector(document.getElementById('myDiv'), 'div.someSelector[some-attribute=true]')

就是这7个JavaScript函数,每个Web程序员都应该知道怎么用它们。你可以在评论里写出其它你认为必备的函数,分享出来,谢谢。

原文链接:http://www.webhek.com/7-essential-javascript-functions

转载于:https://www.cnblogs.com/jasonHome/p/5811558.html

[转]WEB开发者必备的7个JavaScript函数相关推荐

  1. 开发者必备的12个JavaScript库

    现在 web 设计是最有趣的了,做好 web 设计不仅要熟练使用 Javascript,css 和 html 等,还要有自己的创意设计.为了方便大家发挥自己的创意,就产生了很多 JS 框架,Node. ...

  2. Web开发者必备:Web应用检查清单

    本文由 伯乐在线 - 埃姆杰 翻译自 Ata Sasmaz.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [伯乐在线导读]:想做一个高质量的Web应用,前前后后要做的事情非常多.国外开发者 At ...

  3. 九个Web开发者必备的软技能

    对于一份工作,你可能专注于修炼自己的内功,会在不自觉中忽视软技能.硬技能决定你是否能得到工作,而软技能能够表明你是否适合这份工作和适应工作环境等.所有的公司都有属于自己的文化,并努力将这些文化传承下去 ...

  4. Web开发者必备的12款超赞jQuery插件

    jQuery插件能够增强网站的可用性,有效地改善用户体验,还可以大大减少创建一个新站点的开发时间.现在的jQuery插件很多,尽可以根据您的项目要求来选择,不过也有一些插件很好用,几乎各种项目都能够用 ...

  5. WEB开发者应该有哪些必备的技能?

    WEB开发者应该有哪些必备的技能? WEB开发本身涵盖了许多领域的许多技术,那么,有哪些是WEB开发者必备的技能呢?这是一个 Quora 上用户提出的问题,其中Ellyse Taylor的回答获得了1 ...

  6. 网页开发工具有哪些?——开发者必备的15个Web开发工具

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  7. Web开发者十大必备网站资源任你挑

    http://tech.it168.com/a2010/0519/888/000000888016_1.shtml Web开发者十大必备网站资源任你挑 2010年05月19日10:35 来源:51CT ...

  8. 想成为一个高效的Web开发者吗?来看看大牛分享的经验吧~ #精选JAVASCRIPT前端开发...

    想成为一个高效的Web开发者吗?来看看大牛分享的经验吧~ 作为一个软(ku)件(bi)工(de)程(ma)师(nong),你有没有觉得做什么事都没时间?没时间学习新东西,没时间去回顾.整理原来写的烂代 ...

  9. 开发者必备的15 个Web开发工具

    Web开发不是一件轻松的任务,开发者需要做很多的事情来确保网站运行正常.高效- 本文介绍15个非常优秀的每个web开发者都应该拥有的工具,列表如下: 1. Firebug Firebug是Firefo ...

最新文章

  1. Inno Setup制作应用程序安装包
  2. Python数据相关系数矩阵和热力图轻松实现
  3. c/c++面试试题(四)
  4. HTML5响应式品牌服装设计类织梦模板
  5. [渲染层错误] multipolyline.styles: 样式id_【译】关于 SPA,你需要掌握的 4 层
  6. 阿里开源 GNN 框架 Graph-Learn,实现了各类可复用模型和编程接口!
  7. 取消Eclipse的自动代码格式化
  8. python连续写入数据之间用什么隔开_elasticsearch之使用Python批量写入数据
  9. nginx代理服务器
  10. 赵玉海:科技部已组织专家编制中国云
  11. 魅族计算机软件不见了,任务栏不见了
  12. 【ROS实践入门(九)ROS编译ORB-SLAM2运行】
  13. IMPALA(Importance Weighted Actor-Learner Architectures)
  14. QT 实现百万级的数据显示内存消耗几十兆
  15. 联想笔记本 ThinkPad T440 Wifi无法联网的解决方法
  16. 1.3 nuclei sdk Makefile分析
  17. 什么是GPIO?(详细介绍)
  18. 阿里云ACP考试模拟试题(2)
  19. smartGit系列之长期使用批处理脚本
  20. 人工智能人才缺口达500万,北京大学、天津大学、复旦大学、深圳大学等多所高校布局人工智能人才培养

热门文章

  1. django模板导入js,css等外部文件
  2. 人民大学云计算编程的网上评估平台--解题报告 1004-1007
  3. golang中的strings.ContainsAny
  4. csdn第4名靠转载上位
  5. MATLAB如何保存仿真高清图片(matlab)
  6. Protocol Buffer Java应用实例
  7. 混迹网络运营多年经验之谈
  8. MyBatis逆向工程:根据table生成Model、Mapper、Mapper.xml
  9. maven学习(中)- 私服nexus搭建
  10. sublime配置攻略