函数(JavaScript)

函数定义

有两种方式:函数语句与表达式两种。

function fn1(){//函数语句
    console.log('this is fn1');
}
var fn2 = function(){//表达式
    console.log('this is fn2');
}

函数声明语句“被提前”到外部脚本或者外部函数作用域的顶部,所以以这种方式声明的函数可以被它定义之前的代码所调用。but,以表达式定义的函数就不同了,变量的声明会提前到顶部,但是变量的赋值还是在原来的地方执行,所以,只能在表达式定义之后才能够调用这个函数。

函数调用

可以有四种渠道来调用函数:
1. 作为函数
2. 作为方法
3. 作为构造函数
4. 通过call()与apply()的方法简介调用

函数的实参与形参

形参和实参个数不一定匹配,当实参个数<形参个数,剩下的形参就会设置为undefined,为了保持良好的适应性,我们可以对剩余的形参设置默认值。

实参对象是一个类数组对象,可以通过数组下标的方式进行调用,解决了实参个数>形参个数的问题。如arguments[i]。实参对象有一个非常重要的用处就是可以让韩素和操作任意数量的实参。

实参对象有两个特殊属性:callee与caller属性,callee属性指代当前正在执行的函数,caller属性指代调用当前正在实行的函数的函数。

举个栗子,callee在递归调用的时候十分有用

var f = function(x){
    if(x <= 1) return 1;
    return x*arguments.callee(x-1);
}
console.log(f(4));//24

关于实参类型:JavaScript在必要的时候会进行类型转换,所以,实参形参类型要匹配。

自定义函数属性

当函数需要一个‘静态’变量在调用时爆出某个值不变,最方便的方法就是给函数定义属性,而不是定义全局变量。

举个栗子:

function fn(x){
    fn.count++;
    return x*x;
}
fn.count = 0;

控制台输出:

这里写图片描述

函数属性、方法和构造函数

length属性

在函数的体中,arguments.length表示传入函数的实参个数,函数本身的length属性是只读属性,代表函数实参的数量,函数定义时给出的实参个数。
可以通过arguments.length(实际传入实参个数) arguments.callee.length(期待传入的实参个数)来判断传入的参数个数是否正确。

prortotype属性

call()与apply()【就是我没有,我要使用这个工具,我就去借】

他们的第一个参数是调用函数的母对象,它是调用上下文,在函数体内通过this来获取对它的引用,第一个参数之后的所有实参都是要传入待调用函数的值。call与apply的区别就是apply的实参需要放入一个数组当中。

举个栗子:以对象o的方法的形式调用函数f(),并传入两个参数:f.call(o,1,2);f.apply(o,[1,2])

bind()方法

MDN中的解释

bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体(在 ECMAScript 5 规范中内置的call属性)。当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

this.x = 9;
var o = {
    x:81,
    getX: function(){return this.x}
}
var returnX = o.getX;
console.log(returnX());     //9
var oReturnX = returnX.bind(o);
console.log(oReturnX());    //81

除了第一个参数之外,传入bind()的实参都会绑定到this,这是一种常见的函数式编程技术,也称之为“currying”(柯里化)。

var sum = function(x,y){ return x+y};
var succ = sum.bind(null,1);
console.log(succ(2));   //3
function f(y,z){ return this.x+y+z};
var g = f.bind({x:1},2);
console.log(g(3));  //6

Function()构造函数

通过function构造函数来定义:

var f = Function("x","y","return x*y")
//等价于
var f = function(x,y){return x*y}

需要注意的是:它所创建的函数并不是使用词法作用域,相反,函数体代码的编译总是在顶层函数执行

var scope = "global";
function constructFunction(){
    var scope = "local";
    return new Function("return scope");
}
constructFunction()();  //global
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值