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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值