javascript最基本的函数汇总


Posted in Javascript onJune 25, 2015

我记得早期的 JavaScript ,要完成任何事情几乎都绕不开一些简单的函数,因为浏览器提供商实现功能有所差异,而且不只是边缘功能,基础功能也一样,如 addEventListener 和 attachEvent。虽然时代变了,但仍有一些函数是每个开发者都应该掌握的,以便于完成某些功能和提高性能。

debounce

对于高耗能事件,debounce 函数是一种不错解决方案。如果你不对 scroll、resize、和 key* 事件使用 debounce  函数,那么你几乎等同于犯了错误。下面的 debounce 函数能让你的代码保持高效:

// 返回一个函数,如果它被不间断地调用,它将不会得到执行。该函数在停止调用 N 毫秒后,再次调用它才会得到执行。如果有传递 ‘immediate' 参数,会马上将函数安排到执行队列中,而不会延迟。
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);
  };
};
 
// 用法
var myEfficientFn = debounce(function() {
    
// 所有繁重的操作
}, 250);
window.addEventListener('resize', myEfficientFn);

debounce 函数不允许回调函数在指定时间内执行多于一次。当为一个会频繁触发的事件分配一个回调函数时,该函数显得尤为重要。

poll

尽管上面我提及了 debounce 函数,但如果事件不存在时,你就不能插入一个事件以判断所需的状态,那么就需要每隔一段时间去检查状态是否达到你的要求。

function poll(fn, callback, errback, timeout, interval) {
  var endTime = Number(new Date()) + (timeout || 2000);
  interval = interval || 100;
 
  (function p() {
      
// 如果条件满足,则执行!
      if(fn()) {
        callback();
      }
      
// 如果条件不满足,但并未超时,再来一次
      else if (Number(new Date()) < endTime) {
        setTimeout(p, interval);
      }
      
// 不匹配且时间消耗过长,则拒绝!
      else {
        errback(new Error('timed out for ' + fn + ': ' + arguments));
      }
  })();
}
 
// 用法:确保元素可见
poll(
  function() {
    return document.getElementById('lightbox').offsetWidth > 0;
  },
  function() {
    
// 执行,成功的回调函数
  },
  function() {
    
// 错误,失败的回调函数
  }
);

Polling 在 web 中已被应用很长时间了,并在将来仍会被使用。

once

有时候,你想让一个给定的功能只发生一次,类似于 onload 事件。下面的代码提供了你所说的功能:

function once(fn, context) { 
  var result;
 
  return function() { 
    if(fn) {
      result = fn.apply(context || this, arguments);
      fn = null;
    }
 
    return result;
  };
}
 
// 用法
var canOnlyFireOnce = once(function() {
  console.log('Fired!');
});
 
canOnlyFireOnce(); 
// "Fired!"
canOnlyFireOnce(); 
// nada 
          
// 没有执行指定函数

once 函数确保给定函数只能被调用一次,从而防止重复初始化!

getAbsoluteUrl

从一个字符串变量得到一个绝对 URL,并不是你想象中这么简单。对于某些 URL 构造器,如果你不提供必要的参数就会出问题(而有时候你真的不知道提供什么参数)。下面有一个优雅的技巧,只需要你传递一个字符串就能得到相应的绝对 URL。

var getAbsoluteUrl = (function() {
  var a;
 
  return function(url) {
    if(!a) a = document.createElement('a');
    a.href = url;
 
    return a.href;
  };
})();
 
// 用法
getAbsoluteUrl('/something'); 
// http://davidwalsh.name/something

a 元素的 href 处理和 url 处理看似无意义,而 return 语句返回了一个可靠的绝对 URL。

isNative

如果你想知道一个指定函数是否是原生的,或者能不能通过声明来覆盖它。下面这段便于使用的代码能给你答案:

;(function() {
 
 
// 用于处理传入参数 value 的内部 `[[Class]]` 
 var toString = Object.prototype.toString;
 
 
// 用于解析函数的反编译代码
 var fnToString = Function.prototype.toString;
 
 
// 用于检测宿主构造器 (Safari > 4 ;真的输出特定的数组)
 var reHostCtor = /^[object .+?Constructor]$/;
 
 
// 用一个标准的原生方法作为模板,编译一个正则表达式。
 
// 我们选择 'Object#toString' 因为它一般不会被污染。
 var reNative = RegExp('^' +
  
// 将 'Object#toString' 强制转为字符串 
  String(toString)
  
// 转义所有指定的正则表达式字符
  .replace(/[.*+?^${}()|[]/]/g, '$&')
  
// 用 '.*?' 替换提及的 'toString' ,以保持模板的通用性。
  
// 将 'for ...' 之类的字符替换掉,以兼容 Rhino 等环境,因为这些环境添加了额外的信息,如方法参数数量。
  .replace(/toString|(function).*?(?=()| for .+?(?=])/g, '$1.*?') + '$'
 );
 
 function isNative(value) {
  var type = typeof value;
  return type == 'function'
   
// 用 'Function#toString' (fnToString)绕过了值(value)本身的 'toString' 方法,以免被伪造所欺骗。
   ? reNative.test(fnToString.call(value))
   
// 回退到宿主对象的检查,因为某些环境(浏览器)将类型数组(typed arrays)之类的东西当作 DOM 方法,此时可能不遵循标准的原生正则表达式。
   : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;
 }
 
 
// 导出函数
 module.exports = isNative;
}());
 
// 用法
isNative(alert); 
// true
isNative(myCustomFunction); 
// false

这个函数虽不完美,但它能完成任务!

insertRule

我们都知道能通过选择器(通过 document.querySelectorAll )获取一个 NodeList ,并可为每个元素设置样式,但有什么更高效的方法为选择器设置样式呢(例如你可以在样式表里完成):

var sheet = (function() {
    
// 创建 <style> 标签
  var style = document.createElement('style');
 
    
// 如果你需要指定媒介类型,则可以在此添加一个 media (和/或 media query) 
  
// style.setAttribute('media', 'screen')
  
// style.setAttribute('media', 'only screen and (max-width : 1024px)')
 
  
// WebKit hack :(
  style.appendChild(document.createTextNode(''));
 
    
// 将 <style> 元素添加到页面
  document.head.appendChild(style);
 
  return style.sheet;
})();
 
// 用法
sheet.insertRule("header { float: left; opacity: 0.8; }", 1);

这对于一个动态且重度依赖 AJAX 的网站来说是特别有用的。如果你为一个选择器设置样式,那么你就不需要为每个匹配到的元素都设置样式(现在或将来)。

matchesSelector
我们经常会在进行下一步操作前进行输入校验,以确保是一个可靠值,或确保表单数据是有效的,等等。但我们平时是怎么确保一个元素是否有资格进行进一步操作呢?如果一个元素有给定匹配的选择器,那么你可以使用 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);
}
 
// 用法
matchesSelector(document.getElementById('myDiv'), 'div.someSelector[some-attribute=true]')

就这样啦,上述 7 个 JavaScript 函数是每个开发者都应该时刻记着的。有哪个函数我错过了呢?请把它分享出来!

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JavaScript Event学习第五章 高级事件注册模型
Feb 07 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
Jun 25 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
Jan 16 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 Javascript
jQuery表单验证功能实例
Aug 28 Javascript
JavaScript中this详解
Sep 01 Javascript
BootStrap响应式导航条实例介绍
May 06 Javascript
仿百度换肤功能的简单实例代码
Jul 11 Javascript
HTML5 canvas 9绘制图片实例详解
Sep 06 Javascript
Angular.JS中select下拉框设置value的方法
Jun 20 Javascript
JS中使用new Option()实现时间联动效果
Dec 10 Javascript
微信小程序 冒泡事件原理解析
Sep 27 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 #Javascript
javascript中的Function.prototye.bind
Jun 25 #Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 #Javascript
jquery实现的缩略图预览滑块实例
Jun 25 #Javascript
使用javascript提交form表单方法汇总
Jun 25 #Javascript
Jquery结合HTML5实现文件上传
Jun 25 #Javascript
浅谈jQuery.easyui的datebox格式化时间
Jun 25 #Javascript
You might like
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
javascript json2 使用方法
2010/03/16 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python 备份程序代码实现
2017/03/06 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
python已协程方式处理任务实现过程
2019/12/27 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
优秀共产党员先进事迹材料
2014/05/06 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
运动会报道稿300字
2014/10/02 职场文书
2014年英语工作总结
2014/12/20 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
小学教代会开幕词
2016/03/04 职场文书