Javascript备忘复习笔记2
一.函数与形参
1.函数
function abs(x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10));
2.匿名函数
var abs = function (x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10));
3.argument传入参数
- 普通函数写法
function abs() { if (arguments.length === 0) { return 0; } var x = arguments[0]; return x >= 0 ? x : -x; } abs(); // 0 abs(10); // 10 abs(-9); // 9
- 匿名函数写法
var abs = function () { if (arguments.length === 0) { return 0; } var x = arguments[0]; return x >= 0 ? x : -x; } alert(abs(-10)); // 10
4.任意参数(类似python的def foo(a,*b,**c): pass)
function foo(a, b, ...rest) { console.log('a = ' + a); console.log('b = ' + b); console.log(rest); } foo(1, 2, 3, 4, 5); // 结果: // a = 1 // b = 2 // Array [ 3, 4, 5 ] foo(1); // 结果: // a = 1 // b = undefined // Array []
二.变量作用域
1.所有的变量都会绑定到window中;
2.JavaScript的函数会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部;
3.let/const可
替代var
申明一个块级作用域的变量(局部变量)
三.方法
1.在一个方法内部,this
是一个特殊变量,它始终指向当前对象(只作用一层,如果函数内部再定义一层函数,那么里面这个函数的this会指向undefined,补救方法就是引入 var that = this;)
function getAge() { var y = new Date().getFullYear(); return y - this.birth; } var xiaoming = { name: '小明', birth: 1990, age: getAge //此处为函数,不为函数的调用 }; xiaoming.age(); // 25, 正常结果 //错误写法 var fn = xiaoming.age; // 反例,先拿到xiaoming的age函数 fn(); // NaN
- 有点疑惑的是:
//正确写法 var xiaoming = { name: '小明', birth: 1990, age: function () { var that = this; function getAgeFromBirth() { var y = new Date().getFullYear(); return y - that.birth; } return getAgeFromBirth(); } }; alert(xiaoming.age()); //错误写法 var that; function getAgeFromBirth() { var y = new Date().getFullYear(); return y - that.birth; } var xiaoming = { name: '小明', birth: 1990, age: function () { var that = this; return getAgeFromBirth(); } }; alert(xiaoming.age());
2.js的闭包跟python的不同,python是返回函数,js是返回函数的调用!
3.一般的语言中,都是对象调用方法,但js有个比较有趣的点就是可以反过来用apply实现方法指定对象的目的(这个特性可以修复1中的this->undefined的缺陷)
function getAge() { var y = new Date().getFullYear(); return y - this.birth; } var xiaoming = { name: '小明', birth: 1990, age: function (){ return getAge(); } }; alert(getAge.apply(xiaoming,[])); //25,正确 alert(xiaoming.age()); //NaN错误
4.apply实现装饰器
略
5.高阶函数
function abs(z){ if(z<0) return -z; else return z; } function add(x,y,f){ return f(x) + f(y); } alert(add(-3,5,abs));
6. Map/reduce/filter
var arr = [1, 3, 5, 7, 9]; var fun = function (x, y) { return x + y; } var filt = function (s){ return s % 3 === 0; } alert(arr.reduce(fun)); //reduce 25 alert(arr.map(fun)); //map alert(arr.filter(filt)); //filter 3,9
7.扩展sort排序(高阶函数)
var arr = [10, 20, 1, 2]; var after_sort = arr.sort(function (x,y){ if (x>y){ return 1; } if (x<y){ return -1; } return 0; }) alert(typeof(after_sort)); //object alert(after_sort); //[1,2,10,20]
8.闭包
略
9.箭头函数
var fn = x => x * x;
等价于
var fn = function (x) { return x*x; }
10.迭代器
略