JavaScript函数基本概念

函数

js的函数和python差不多,def 换成function

arguments

js函数在使用时传入的参数可以不与定义的参数个数相等(可多可少),

arguments用于获取所有传入的参数,用法类似与array

rest

用法

function f(a,b,...rest)

获取除了自定义的a,b参数外的其余参数,用法和array类似,若无,则返回空数组。

全局对象

全局对象类似于命名空间,一般情况下我们所写的变量都会在一个叫window的命名空间内。如:

var a = 1;
console.log(a);
#等价于console.log(window.a)

也可以以对象的方式自己定义一个命名空间

var name_space = {}
name_space.a = 1
name_space.func = function(...){...}

console.log(name_space.a)

this

在对象内的this指向该对象,但在对象外使用this,会指向全局变量window。

var obj = {
    name:10,
    getName:function(){
        return this.name
    }
};

使用getName时,应该
obj.getName();
而不是

var f = obj.getName
f()

这样this又会指向window!

另外,若

getName = function(){
    return this.name
}

var obj = {
    getName:getName
};

这样也会使得this指向window

apply和call

这两者都是为了解决this的指向问题

function getAge() {
    return this.birth;
}

var xiaoming = {
    name: '小明',
    birth: 1990,
    age: getAge
};

getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空

调用函数自身的apply方法,可以让this指向某个对象,第二个参数是传入的参数;

call的用法和apply类似,区别是第二个参数不是数组,而是把他拆分成单独的参数传入,

如apply传入的是[1,2,3],call传入1,2,3。

高阶函数

map/reduce

内置与array中,传入一个函数,用法

array.map(f)

map的作用是使得[x1,x2,x3,…]转化为[f(x1),f(x2),f(x3),…]

array.reduce(f)

reduce的f传入两个参数,前两个参数的结果作为下一次计算的第一个参数:

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4),

这种方法可以用于求累加,累乘等运算。

filter

用于过滤,若函数输出结果为false,则删除该元素,若为true,则保留

如实现保留奇数过滤偶数的功能:

array.filter(function(x){

	return x%2 === 1;

});

sort

用于自定义的排序,传入两个参数x和y,若返回-1则把x排在y前面,返回0则认为两者相等,返回1则把y排在x前面。

array.sort(function(x,y){
    if (x<y)
    	return -1;
    else if (x>y)
    	return 1;
    else
    	return 0;
})

注意,js默认的sort函数是先将元素转化为字符类型,再排序,所以若对

[1,2,10]排序,会返回[1,10,2]!

匿名函数

用法

var f = x => x*x

若要输入/输入多个值,应该

var f = (x,y) => {
    if (x>y)
    	return -1;
    else
    	return 1;
};

另外值得注意的是匿名函数中的this的作用域是他所处的{},而不是window

generator

生成器的用法和python差不多,使用function*定义

function* gen(){
    var i = 0;
    var max = 100;
    while (i<max){
        yield i;
    }
    return;
}

使用生成器有两种方法

1、使用next()函数

var f = gen();
f.next();//返回{value:0,done:false}
...
f.next();//{value:undefined,done:true}

这种方法会返回一个字典,并且需要自己判断是否读取完所有的值

2、使用for … of:

这种方法和python一样,不详述。

猜你喜欢

转载自blog.csdn.net/a13602955218/article/details/84797158