JS函数

函数其实就是一段具有特定功能的代码块,作用是将重复出现的代码封装起来,需要的时候直接调用。

一、常见的函数定义的方式及其异同之处

  1. 函数声明
    function Fn(arguments){
        //函数体
    }
  2. 函数表达式
    var Fn = function (arguments){
        //函数体
    }
  3. 构造函数
    var Fn = new Function("arguments","函数体");
  4. ES6:箭头函数
    fn = (arguments)=>函数体;
  • 相同之处:都是Function对象的实例
  • 不同之处:

a.存在函数声明提前,即JS引擎将会优先解析函数声明的函数,然后是函数表达式的函数,最后才是构造函数的函数;

b.前两者第一次解析完成后再调用时不再重新解析,而构造函数的函数每次调用都要重新编译;

c.函数声明必须给函数命名,而函数表达式则不必须,可用作匿名函数;

d.函数声明重名将会覆盖之前的声明,而函数表达式将会是变量的重新赋值;

e.函数声明的调用可以出现在声明之前,函数表达式的调用只能出现在表达式之后。(函数声明提升)

a();//1
function a(){
    console.log(1);
}

b();//报错:b is not a function
var b=function () {
    console.log(2);
};

f.使用构造函数定义函数的方法,函数体其实相当于一段表达式,前两种方法的函数体则是作为一段结构出现。

(箭头函数不包括在上述异同点的比较中)

二、函数的参数

函数的参数可以是任意数据类型,有形参和实参之分。形参一般出现在函数定义时关键词function后的小括号中,实参则一般出现在函数调用时函数名后的小括号中。形参和实参的个数可以不相等。

三、变量

函数的变量有全局变量和局部变量之分。出现场合一般分别有如下几种: 

     1.全局变量:在整个作用域链中都是有效的,一直存在,可被任意位置取得。

  • 在函数外部定义的变量
  • 在函数内部定义但未使用var关键词定义的变量
  • for循环中的i
    for (var i=0; i < 10; i++){
        // console.log(i);//其他语言中,变量i只能在for循环内部访问
    }
    console.log(i);//10

这两种全局变量存在一个小小的区别:后者使用delete可以被删除,而前者则不可以。

     2.局部变量:只存在于函数中,函数调用结束,变量随之被销毁。在该函数外部不可被取得。

  • 在函数内部定义且使用了关键词var定义的变量
  • 函数的形参

四、作用域链:指变量可以访问的范围,不同的变量对应有不同的作用域。

函数内部可以访问到函数外部的作用域,但函数外部不能访问到函数内部的作用域。也就是说,寻找变量时,优先从小作用域开始;如果找不到,再去大作用域找;如果还是没有,报错。但大作用域不可以不可以去小作用域中寻找。

var a = 10;
f();
function f(){
    var a = 20;
    var b = 30;
    console.log(a);//20
}
console.log(b);//报错:b is not defined

五、函数的返回值

  • 函数的返回值一般会作为一个变量被return出去。
  • return之后的语句不再执行了。
  • 若函数无显式返回值,则函数的默认返回值为undefined。

六、函数的对象arguments

  • 具有length属性,可以获取到函数所具有的形参的个数。但它并不是一个数组,只是一个类数组,并不具有其他的数组方法。
  • 具有callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。经典运用:斐波那契数列。

七、函数属于什么数据类型呢?

function fn(){
    alert(000);
}
console.log(typeof fn);//function

数据类型中本没有function这一类型,由此可见,函数确实是JS中的一等公民。

八、变量提升和函数声明提升

JS引擎在代码执行时,会将函数声明和变量声明(var 变量)都提升到当前作用域的最前面。

注意点:

  • 看过一种说法:变量和函数同名时,将会保留函数。但我认为得看具体的代码,举两个具体的栗子:
    var a;
    function a(){
        console.log(1);
    };
    console.log(a);//输出函数a,执行的是函数
    a=2;
    console.log(a);//2
    
    var b=3;
    function b() {
        console.log(4);
    }
    console.log(b);//3,执行的是变量
  • 无论是变量的提升还是函数声明提升,都只是提升声明,并不会提升变量的赋值或函数的调用。
    f();
    function f(){
        console.log(b);
        var b=2;
    };
    var a=1;
    
    //如上面这段代码解析后应变成如下这样:
    var a;
    function f(){
        var b;
        console.log(b);//undefined;
        b=2;
    }
    f();
    a=1;
  • 只在全局作用域下提升,函数中的变量不提升;函数执行时,其中的变量才会提升。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值