> 闭包
1.函数作为返回值
我们来实现一个对Array的求和。通常情况下,求和的函数是这样定义的:
function sum(arr){
return arr.reduce(
function(x,y){
return x+y;
}
);
}
但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数!
function sum(arr){
var sum1=function(){
return arr.reduce(function(x,y){
return x+y;
});
}
return sum1();
}
var f=sum([1,2,3,4]);
这里返回的并不是求出的值,而是求和函数,所以要求和,必须调用f()函数。
我们在函数 sum中又定义了函数sum1,并且,内部函数sum1可以引用外部函数 sum的参数和局部变量,当l sum返回函数sum1时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
闭包不只是返回一个函数,让后延迟它的执行。
在没有class机制,只有函数的语言里,借助闭包,同样可以封装一个私有变量。我们用JavaScript创建一个计数器:
function create_counter(initial) {
var x = initial || 0;
return {
inc: function () {
x += 1;
return x;
}
}
}
var c1 = create_counter();
c1.inc(); // 1
c1.inc(); // 2
c1.inc(); // 3
var c2 = create_counter(10);
c2.inc(); // 11
c2.inc(); // 12
c2.inc(); // 13
> 箭头函数
箭头函数课以完全恢复this的走向,this总是指向词法作用域
如果使用箭头函数,以前的那种hack写法:var that = this;
var obj={
birth:1996,
getAge:function{
var b=this.birth;
var fn=function(){
// return new Date().getFullYear() - this.birth;//这里的this指向undifined 或者Window
var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
}
return fn();
}
}
obj.getAge();
由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略:
var obj = {
birth: 1990,
getAge: function (year) {
var b = this.birth; // 1990
var fn = (y) => y - this.birth; // this.birth仍是1990
return fn.call({birth:2000}, year);
}
};
obj.getAge(2015); // 25
> 标准对象
Date RegExp Json 三大对象
Date:
获取系统时间:
var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份,注意月份范围是0~11,5表示六月
now.getDate(); // 24, 表示24号
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小时制
now.getMinutes(); // 49, 分钟
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1435146562875, 以number形式表示的时间戳
注意,当前时间是浏览器从本机操作系统获取的时间,所以不一定准确,因为用户可以把当前时间设定为任何值。
js中 获取月份的时候 它的范围是0~11,这是当初设计者设置,对于现在而言,是无法更改的,所以当我们在掉用的时候我们必须要在上面加1
RegEpx
定义正则表达式
调用test()方法判断是否匹配
var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
定义正则表达式
调用exec()方法判断是否匹配
按要求截取字符
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
Json
把一个对象序列化
序列化:
'use strict';
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\"W3C\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
var s = JSON.stringify(xiaoming);
console.log(s);
输出
{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
第二个参数用于控制如何筛选对象的键值,如果我们只想输出指定的属性,可以传入Array:
JSON.stringify(xiaoming, [‘name’, ‘skills’], ’ ');
输出结果
{
“name”: “小明”,
“skills”: [
“JavaScript”,
“Java”,
“Python”,
“Lisp”
]
}
反序列化
把一个Json 反序列化
拿到一个JSON格式的字符串,我们直接用JSON.parse()把它变成一个JavaScript对象:
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
JSON.parse()还可以接收一个函数,用来转换解析出的属性:
var obj = JSON.parse('{"name":"小明","age":14}', function (key, value) {
if (key === 'name') {
return value + '同学';
}
return value;
});
console.log(JSON.stringify(obj)); // {name: '小明同学', age: 14}