49.函数

自己再总结的:函数声明有函数声明和表达式声明,表达式声明不会前置。

定义变量不加var 则是全局变量。

函数声明

function functionName(){
    statement;
}

使用function关键字可以声明一个函数,看个例子

function printName(){
    console.log('Byron');
}

printName();

函数表达式

var printName = function(){
    console.log('Byron');
};

区别在于:
a.函数声明会在任何表达式被解析和求值之前先被解析和求值,即使声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值。示例:
<pre>
alert(fn());
function fn() {return 'Hello world!';}
</pre>
b.函数声明在条件语句内虽然可以用,但是没有被标准化,也就是说不同的环境可能有不同的执行结果,所以这样情况下,最好使用函数表达式:
c.函数声明的syntax:
<pre>function 函数名(){}</pre>
函数表达式的syntax:
<pre>var 变量名=function 函数名(){};</pre>

函数声明结尾没有分号,但是函数表达式以分号结尾。


在函数内部,你可以使用arguments对象获取到该函数的所有传入参数

function printPersonInfo(name, age, sex){
    console.log(name);
    console.log(age);
    console.log(sex);
    console.log(arguments);
}

什么是变量的声明前置?什么是函数的声明前置?
变量的声明前置:JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果就是所有的变量的声明语句,都会被提升到代码的头部,也称为变量提升。
函数的声明前置:函数声明过程在整个程序执行之前的预处理就完成了,所以只要在同一作用域,就可以访问到,即使在定义之前调用也可以。

声明提前

和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样

console.log(fn); //undefined

var fn = function(){}

如果我们使用函数声明的方式,那么即使函数写在最后也可以在前面语句调用,前提是函数声明部分已经被下载到本地

fn(); // "1"

function fn(){
    console.log('1');
}

重载


也就是说相同名字的函数参数个数不同或者顺序不同都被认为是不同的函数,称为函数重载

在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的,这是不是意味着JavaScript不能通过重载功能实现一个函数,参数不同功能不同呢?

在JavaScript中,函数调用没必要把所有参数都传入,只要你函数体内做好处理就行,但前提是传的参数永远被当做前几个

function printPeopleInfo(name, age, sex){
    if(name){
        console.log(name);
    }

    if(age){
        console.log(age);
    }

    if(sex){
        console.log(sex);
    }
}


printPeopleInfo('Byron', 26);
printPeopleInfo('Byron', 26, 'male');
4.函数的重载怎样实现?
JavaScript没有重载函数这个概念,但是可以通过arguments来模拟函数重载。实现代码示例:
<pre>
function sum(){
var sum=0;
for(var i=0;i < arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
sum(1,2);
</pre>

命名冲突

当在同一个作用域内定义了名字相同的变量和方法的话,会根据前置顺序产生覆盖

    var fn = 3;
    function fn(){}

    console.log(fn); // 3

相当于

var fn
function fn(){}  //覆盖上面的

fn = 3  //重新赋值
console.log(fn)

当函数执行有命名冲突的时候,可以认为在还是内部一开始有隐藏的声明变量这个操作

function fn(fn){
  console.log(fn);

  var fn = 3;
  console.log(fn);
}

fn(10); //10 3

JavaScript的作用域是靠函数来形成的,也就是说一个函数内定义的变量函数外不可以访问

function fn(){
  var a =1;

  if(a > 2){
    var b = 3;
  }
  console.log(b);
}

fn(); // undefined

console.log(a); // "ReferenceError: a is not defined

var

在声明变量的时候需要var,这样声明的变量作用域才符合我们上面提到的规则,那么不写var会怎么样呢

    function fn(){
      a = 1;
    }

    fn();

    console.log(a); // 1

可以看到不写var会声明一个全局的变量,这是我们在编程中应该要避免的,即使真的需要全局变量,也应该在最外层作用域使用var声明






作者:betterwlf
链接:https://www.jianshu.com/p/70a7c75b863e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


作者:betterwlf
链接:https://www.jianshu.com/p/70a7c75b863e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的大学生第二课堂系统,旨在为大学生提供一个便捷、高效的学习和实践平台。项目包含了完整的数据库设计、后端Java代码实现以及前端Vue.js页面展示,适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 在功能方面,系统主要实现了以下几个模块:用户管理、课程管理、活动管理、成绩管理和通知公告。用户管理模块支持学生和教师的注册、登录及权限管理;课程管理模块允许教师上传课程资料、设置课程时间,并由学生进行选课;活动管理模块提供了活动发布、报名和签到功能,鼓励学生参与课外实践活动;成绩管理模块则用于记录和查询学生的课程成绩和活动参与情况;通知公告模块则实时发布学校或班级的最新通知和公告。 技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,确保了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提升了用户体验和开发效率。 该项目不仅提供了完整的源代码和相关文档,还包括了详细的数据库设计文档和项目部署指南,为学习和实践提供了便利。对于基础较好的学习者,可以根据自己的需求在此基础上进行功能扩展和优化,进一步提升自己的技术水平和项目实战能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值