函数

//定义函数 0-100 相加
function getSum() {
var sum = 0;
for (let i = 1; i <= 100; i++) {
sum += i;
}
console.log(sum);
}
//调用函数
getSum(); // 求 n-m 之间所有的数的和
//n,m 形式参数 function getSum1(n, m) {
var sum = 0;
for (let i = n; i <= m; i++) {
sum += i;
}
console.log(sum);
}
//传入实参
getSum1(10, 19); getSum1(undefined, 10);//0 undefined 会转换为 0 // 两个数相加
function getsum2(a, b) {
//如果a是空(undefined,null,0,空字符串,NaN) 让a默认为0;
if (!a) {
a = 0;
}
a = a || 0;
b = b || 0;
//todo 判断a和b是否为数字
console.log(a + b); }

函数的参数和返回值

function getSum1(n, m) {
var sum = 0;
for (let i = n; i <= m; i++) {
sum += i;
}
//返回计算的结果
return sum;
//console.log("hahah"); // 不会执行,函数返回,后续的代码不会执行。
}
var sum = getSum(1,20);
console.log(sum); console.log(getSum(1,10));

函数的几种形式

  • 有参数 无返回值
  • 有参数 有返回值
  • 无参数 无返回值
  • 无参数 有返回值

练习:

求圆的面积

//pi*r*r
function getArea(r) {
//过滤掉undefined null 0 "" NaN
r = r || 0;
//todo 判断是否是数字
var pi = 3.1415926;
return pi * r * r;
}
var area = getArea(5);
console.log(area);

函数的三要素

  • 1 函数的功能
  • 2 函数的参数
  • 3 函数的返回值

求面积

function getArea1(r) {
//pi Math.PI
//Math.pow() //求平方
r = r || 0;
return Math.PI * Math.pow(r, 2);
} //求2个数中的最大值
function getMax1(a, b) {
return a > b ? a : b;
}
console.log(getMax1(66, 22))
//求3个数中的最大值
// 方法一
function getMax(a, b, c) {
return (a > b ? a : b) > c ? (a > b ? a : b) : c
}
console.log(getMax(12, 43, 2));
// 方法二
function getArea2(a, b, c) {
return getMax1(getMax1(a, b), c);
}
console.log(getArea2(323, 232, 111)); //如果一个函数内部调用另一个函数,是怎么执行的 执行的过程
// 当fun2 执行完毕之后,会回到fun1继续往下执行。
function fun1() {
console.log("fun1");
fun2();
console.log("over");
}
function fun2() {
console.log("fun2");
}
fun1();

当函数没有写 return 的时候回返回 undefined

function test(){
var a = 5;
}
console.log(test() ); //undefined

函数的返回值

  1. 如果 return 后面跟内容了,返回 return 后面的内容

  2. 如果 return 厚点没有跟内容,返回 undefined

  3. 如果函数内部没有写return,返回 undefined

     //求一数组中的最大值
    var array = [3, 5, 46, 324, 21, 11]; function getMax(array) {
    array = array || [];
    //todo 判断array是否是数组
    if (array.length == 0) {
    return; //undefined
    }
    var max = array[0];
    for (let i = 0; i < array.length; i++) {
    max = max < array[i] ? array[i] : max; }
    //返回最大值
    return max;
    }
    console.log(getMax(array));

函数的参数

  1. 形参——定义函数的时候,没有实际的值,给实参占位
  2. 实参——调用函数的时候,有实际的值
  3. 函数调用的时候,实参的个数可以不用和实参的个数相等
  4. 当函数调用 getSum() 的时候,会把实参的a和b 赋值一份传递给getSum函数

函数的返回值

  1. 如果 return 后面跟内容了,返回 return 后面的内容
  2. 如果 return 后面没有跟内容,返回 undefined,return 后面的代码不被执行。
  3. 如果函数内部没有写 return,返回 undefined
  4. 推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。

函数内部可以调用其他函数

  • 执行的过程
  1. 函数执行内部调用的函数的时候,会执行内部的函数,当内部的函数执行完毕,会继续执行当前的函数。

函数的参数练习:

 function getSum(a, b) {
a = 100;
return a + b;
}
var a = 10;
var b = 30;
getSum(a, b); //当函数调用getSum的时候,会把实参的a和b 赋值一份传递给getSum函数。
console.log(getSum(a, b)); console.log(a); //在JavaScript 中实参的个数可以和形参的个数不一致
function getSum(a, b, c) {
a = a || 0;
b = b || 0;
c = c || 0;
return a + b;
}
var sum = getSum(1, 2);
console.log(sum);
  • 在其他语言中,有重载的概念

  • 重载,函数名字相同,但是参数个数不同

  • JavaScript 中没有重载的概念。

  • 下面的相同名称的函数会把上面的函数覆盖

  • 在 JavaScript 中不允许出现同名的函数

      function f1(a, b) {
    return a + b;
    }
    function f1(a, b, c) {
    return a + b + c;
    }
    console.log(f1(1, 2)); //报错 NaN。就近原则,没有重载。 //不弹框,alert方法会覆盖掉系统自带alert();
    function alert(a) {
    console.log(a);
    }
    alert("abc");

定义函数的两种方式

1 函数声明

//问题: 为什么先调用,再声明也可以使用?
//答:预解析,function被提前了。
console.log(fnName(1,2));
function fnName(a,b){
return a+b;
}

2 函数表达式

var a =5;
//Uncaught TypeError: fnName is not a function
// 问题:为什么出错?
// 答: fnName被提前声明。然后fnName(1,2)调用了一个空的函数。
console.log(fnName(1,2));
var fnName =function (a,b){
return a+b;
}

变量的作用域:

变量在什么位置可以使用?

全局作用域:

在任何位置都可以访问

var name ="a"; //全局变量
function f1(){
console.log(name);
}
f1(); //局部作用域:在函数内部声明一个变量,只能在函数内部使用
function f1(){
var name ="aaa";//局部变量
console.log(name);
}
f1();
console.log(name);//无法访问f1函数中的name="aaa";
  • 当变量超出作用域之后,变量会被销毁。
  • 能不用全局变量就不用全局变量,好处是一直不被释放,坏处是一直占用内存。
  • 判断是否是全局变量,可以在函数内部输出一下,在函数外部输出一下。
  • 不使用 var 定义的变量是全局变量
  • 变量在退出作用域之后会销毁,全局变量在关闭网页或者浏览器才会销毁

JavaScript中没有块级作用域

// 块级作用域
{
//代码块
//在其他语言中,在代码块中定义的变量,外部似乎访问不到的
//但是JavaScript中没有块级作用域
var name ="abc";
console.log(name); //abc
}
console.log(name); //abc

JavaScript 一般在 if 判断语句和 for 循环中会使用到块级作用域。

匿名函数

function fnName() {

}
// 匿名函数
var myFun = function () { } // function(){
// console.log("test"); // }
// 上述代码会报错 // 自调用函数 只能执行一次
(function () {
console.log("test");
})();

什么时候是局部变量

  • 在函数内部使用 var 声明的变量

什么时候是全局变量

  • 只要在<script>标签内部定义的变量是全局变量,不是用 var 声明直接使用的变量是全局变量

<script>var a=50</script>

<script>console.log(a)</script>

只要是script标签就是全局变量,所以显示50。

变量提升

定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升。

函数提升

JavaScript解析器首先会把当前作用域的函数声明提前到整个作用于的最前面

闭包:

函数内部可以访问到函数外部的变量

javascript_10-函数的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

  10. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

随机推荐

  1. 【DataBase】H2 DateBase的拓展使用

    连接模式 支持以下连接模式: 嵌入模式(使用JDBC的本地连接) 服务器模式(使用JDBC或ODBC over TCP / IP进行远程连接) 混合模式(同时本地和远程连接) 嵌入模式 在嵌入模式下, ...

  2. Chrome V75V76新版无法存为mhtml格式解决办法

    升级到75.76版本后谷歌浏览器Chrome V75.0.3770.142 V76.0.3809.87新版,发现无法另存为/保存网页为MHTML了.原来chrome搞了个"Chrome Fl ...

  3. mysql 1045

    1.sudo gedit /etc/my.cnf 2.加入 skip-grant-tables 3.直接登录,输密码时回车 mysql -u root -p 4.修改密码 use mysql; upd ...

  4. Qt编写气体安全管理系统22-报警联动

    一.前言 报警联动功能不是一个常规的功能,一般是给客户定制的功能,比如探测器采集到的数据报警了,不仅本地要播放报警声音,存储报警记录,发送报警短信和邮件,还需要触发警号面板灯进行报警,而警号面板指示灯 ...

  5. mybatis查询mysql数据库tinyint(1)变为boolean类型

    mybatis查询mysql数据库对象转化为Map,tinyint(1)被转化为boolean类型,可以t通过避免使用tinyint(1)来解决.

  6. MySQL普通索引性能试验

    首先使用如下node.js脚本创建两张表,并为这两张表各自生成10000条数据: var fs = require('fs'); var nameS = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱 ...

  7. 提示不是内部或外部命令-Java的jdk、JRE包

    因为要测试后台程序的功能,所以要先安装Java的jdk包,配置环境变量. 首先要安装jdk和jre,才是完整的,只安装其中一个的话,在cmd命令行输入“JAVAC”会提示“不是内部或外部命令” 目前最 ...

  8. Java学习,从入门到放弃(二)Linux配置mvn

    其实网上的教程很多,随便拿一个,比如:https://www.cnblogs.com/chuijingjing/p/10430649.html 但在实践过程中,发现可能需要将JAVA_HOME也加到 ...

  9. 第07组 Alpha冲刺(4/4)

    队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...

  10. Mstar方案软件运行基本原理

    1. MApp_Main.c里有个while(1)循环: 2. 通过 while(1)循环MApp_MultiTasks 里面的 MApp_ProcessUserInput 可以 得到 当前的 u8K ...