JavaScript事件bind方法的个人笔记

上期答疑

1.30CAC0040取出40,3SFASDF92取出92

var reg = /\d{2}$/g;

2.使字符串内空格统一,如:蓝 色 理 想——蓝 色 理 想

var reg = /\s+/g;
str.replace(reg,' ');

3.判断字符串是不是由数字组成

var reg = /^\d+$/g;

4.手机电话号码正则表达式

reg = /^1\d{10}$/;

5.只能输入数字和.

reg = /^[0-9\.]+$/g;

6.只能输入英文字母和. / \ :

reg = /^[A-Za-z\.\\\/:]+$/;//不可A-z,中间会有[\]^_`等字符

7.替换字符串.前为指定内容

reg = /^\w*/g;
str.replace(reg,'*');//*为指定内容

8.只匹配中文

reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]*/g;

9.只取匹配IP地址前三段

reg = /\.\d{1,3}$/g;
str.replace(reg,'');//把末尾的替换成空即可

10.匹配<ul></ul>之间的内容

reg = /<ul>[\d\D]+<\/ul>/i;//[\d\D]即所有

11.正则表达式获得文件名

var reg = /[^\\\/]*[\\\/]+/g;//注意有的路径/\符号
str.replace(reg,'');//把最后的//前的路径替换成空

12.绝对路径变相对路径

reg = /(http|https):\/\/[^\/]+/g;
str.replace(reg,'');

13.用户名正则表达式,中文、英文、数字、下划线、4-16个字符

reg = /^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/g;

14.匹配英文地址,包含.,字母 数字,但开头只能是字母

reg = /^[A-Za-z][\.,\s0-9A-Za-z]*[A-Za-z]$/g;

15.匹配价格,开头数字若干,可能小数点以及后两位

reg = /^\d+(\.*\d{0,2})$/g;

16.份证号匹配,最后一位可能为X

reg = /^(\d{14}|\d{17})(\d|[xX])$/;

17.邮箱正则表达式khh_515gkg@qq.com

reg = /^([A-Za-z0-9_-])+@([A-Za-z0-9_-])+(\.[A-Za-z0-9_-]+)$/g;

18.正则验证日期格式yyyy-mm-dd格式

reg = /^\d{4}-\d{1,2}-\d(1,2)$/

注意这里答案的形式不固定,多举几个例子进行验证

一、引出

例一

var x = 10;
function show(a,b){
    console.log(this.x,a,b);
};
show('a','b');//10 "a" "b"
var obj = {
    x : 20
}
var newshow = show.bind(obj,'c','d');
newshow();//20 "a" "b"
var newshow1 = show.bind(obj,'e');
newshow1('f');//20 "e" "f"

例二

var list = {
    init : function (){
        this.name = 'jimo',
        this.btn = document.getElementsByTagName('button')[0],
        this.bindEven();
    },
    bindEven : function(){
        this.btn.onclick = this.show.bind(this,22,'man');
    },
    show : function (a,b){
        console.log(this.name,a,b);
    }
}
list.init();//点击后输出:jimo 22 man

分析
以第一个例子来说,这里的bind方法会把它的第一个实参绑定给f函数体内的this,所以前面的this即指向{x:20}对象;
从第二个参数起,会依次传递给原始函数,这里的第二个参数2即是‘a’;
最后调用show1(‘f’)的时候,这里的’f’便是最后一个参数z了,所以执行结果为20 “a” “b”
分步处理参数的过程其实是一个典型的函数柯里化的过程(Curry)

var a = document.write;
a('hello'); // error
a.bind(document)('hello'); // hello
a.call(document,'hello'); // hello

分析
直接调用a的话,this指向的是global或window对象,所以会报错;
通过bind或者call方式绑定this至document对象即可正常调用

二、原理

Function.prototype.newBind = function (target){
    var self = this;//保存调用者this
    var args = [].slice.call(arguments,1);//用数组方法截取当前arguments参数组的0:target后的参数
    var temp = function (){};
    var f = function (){
    	var _arg = [].slice.call(arguments,0);//截取新函数的实参
    	return self.apply(this instanceof temp ? this : (target || window),args.concat(_arg));//返回外界,然后拼接参数
    }
    temp.prororype = self.prototype;
    f.prototype = new temp();//圣杯模式,继承原型
    return f;
};

博主开始运营自己的公众号啦,感兴趣的可以关注“飞羽逐星”微信公众号哦,拿起手机就能阅读感兴趣的博客啦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞羽逐星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值