javascript最基本的函数汇总

   这篇文章主要给大家汇总介绍了javascript最基本的7个函数,十分的实用,有需要的小伙伴可以参考下。

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

  debounce

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

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

// 返回一个函数,如果它被不间断地调用,它将不会得到执行。该函数在停止调用 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 函数,但如果事件不存在时,你就不能插入一个事件以判断所需的状态,那么就需要每隔一段时间去检查状态是否达到你的要求。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

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 事件。下面的代码提供了你所说的功能:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

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。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14

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

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

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

;(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 ,并可为每个元素设置样式,但有什么更高效的方法为选择器设置样式呢(例如你可以在样式表里完成):

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

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 函数来校验:

  ?

1
2
3
4
5
6
7
8
9
10

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 函数是每个开发者都应该时刻记着的。有哪个函数我错过了呢?请把它分享出来!

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

时间: 2024-11-08 20:16:51

javascript最基本的函数汇总的相关文章

javascript最基本的函数汇总_javascript技巧

我记得早期的 JavaScript ,要完成任何事情几乎都绕不开一些简单的函数,因为浏览器提供商实现功能有所差异,而且不只是边缘功能,基础功能也一样,如 addEventListener 和 attachEvent.虽然时代变了,但仍有一些函数是每个开发者都应该掌握的,以便于完成某些功能和提高性能. debounce 对于高耗能事件,debounce 函数是一种不错解决方案.如果你不对 scroll.resize.和 key* 事件使用 debounce  函数,那么你几乎等同于犯了错误.下面的

JavaScript数组操作函数汇总_javascript技巧

js中数组操作函数还是非常多的,今天忽然想到来总结一下,也算是温故而知新吧.不过不会针对每个办法都进行一下总结,只是针对一些比较常用的做个备注一下. 这里总结到的 js 数组操作函数有:push,pop,join,shift,unshift,slice,splice,concat(1)push 和 pop这两个函数都是对数组从尾部进行压入或弹出操作.push(arg1,arg2,...)可以每次压入一个或多个元素,并返回更新后的数组长度.注意如果参数也是数组的话,则是将全部数组当做一个元素压入到

JavaScript对象创建模式实例汇总_javascript技巧

本文实例总结了JavaScript对象创建模式.分享给大家供大家参考,具体如下: 在JavaScript中创建对象是很容易的,可以使用对象字面量或者构造函数.常用的创建对象的模式有以下几种: 一. 工厂模式 工厂模式抽象了具体对象的过程,用函数来封装以特ing接口创建对象的细节. 如下: function createAnimal(name, age) { var o = new Object(); o.name = name; o.age = age; o.sayName = function

JavaScript教程:编写匿名函数的几种方法

匿名函数可以有效控制变量作用域,构造闭包 (Closure),防止对全局变量造成污染.在 JavaScript 中,编写匿名函数,有以下几种方法: 错误模式:语法错误警告 function(){ // insert code here }(); 模式一:函数字面量 (Function Literal) 先声明函数对象,然后执行. (function(){ // insert code here })(); 模式二:优先表达式 (Prior Expression) 由于 JavaScript 按照

javascript学习笔记之函数定义

  本文主要给大家介绍了javascript的一些函数定义方面的基础知识,包括函数声明式.函数表达式.Function 构造函数等,十分的简单实用,有需要的小伙伴可以参考下. 函数声明式 ? 1 2 3 4 5 function funname( 参数 ){   ...执行的代码   } 声明式的函数并不会马上执行,需要我们调用才会执行:funname(); * 分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句,所以不以分号结束. 函数表达式 ? 1 2 3 4 5

PHP网络操作函数汇总

  这篇文章主要介绍了PHP网络操作函数汇总,本文列举了如gethostbyaddr.gethostbyname.header_remove.http_response_code.ip2long等网络中经常用到的函数,需要的朋友可以参考下 checkdnsrr - 给指定的主机(域名)或者IP地址做DNS通信检查 closelog - 关闭系统日志链接 define_syslog_variables - 初始化所有syslog相关变量 dns_check_record - checkdnsrr别

javascript中一些util方法汇总

 javascript中一些util方法汇总 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

JavaScript时间转换处理函数

 JavaScript时间转换处理函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /** * 将格式为yyyy-MM-dd hh:mm:ss.S的字符串转为Date * @param dateString 时间字符串 */ function convertToDate(dateString){ return new Date(dateString.replace(/-/g,"/")); }   /** * 比较时间 * @param date1 *

JavaScript自定义等待wait函数实例分析

 这篇文章主要介绍了JavaScript自定义等待wait函数,实例分析了自定义等待函数的实现与使用技巧,需要的朋友可以参考下     本文实例讲述了JavaScript自定义等待wait函数用法.分享给大家供大家参考.具体分析如下: 下面是一个js自定义的wait函数,可以暂停程序的执行 ? 1 2 3 4 5 6 7 8 function sleep(delay) { var start = new Date().getTime(); while (new Date().getTime()