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.迭代器

原文地址:https://www.cnblogs.com/alexkn/p/4765159.html