javascript_10-函数
函数
//定义函数 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
函数的返回值
如果 return 后面跟内容了,返回 return 后面的内容
如果 return 厚点没有跟内容,返回 undefined
如果函数内部没有写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));
函数的参数
- 形参——定义函数的时候,没有实际的值,给实参占位
- 实参——调用函数的时候,有实际的值
- 函数调用的时候,实参的个数可以不用和实参的个数相等
- 当函数调用 getSum() 的时候,会把实参的a和b 赋值一份传递给getSum函数
函数的返回值
- 如果 return 后面跟内容了,返回 return 后面的内容
- 如果 return 后面没有跟内容,返回 undefined,return 后面的代码不被执行。
- 如果函数内部没有写 return,返回 undefined
- 推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。
函数内部可以调用其他函数
- 执行的过程
- 函数执行内部调用的函数的时候,会执行内部的函数,当内部的函数执行完毕,会继续执行当前的函数。
函数的参数练习:
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-函数的更多相关文章
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- C++中的时间函数
C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
随机推荐
- 报错:HDFS IO error org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/yk/dl/alarm_his":hdfs:supergroup:drwxr-xr-x
报错背景: CDH集成了Flume服务,准备通过Flume将kafka中的数据放到HDFS中, 启动Flume的时候报错. 报错现象: // :: INFO hdfs.HDFSDataStream: ...
- 给APK签名,修改签名
简介: 本来是不需要签名的,但是我有个android的专用设备,限制安装,但是售后给我通过了一个证书的验证. 那么我想装什么软件,就需要这个证书验证. 现在记录一下签名的主要过程,还有修改签名的方法. ...
- [ kvm ] 学习笔记 3:KVM 基础功能详解
1. 构建 KVM 环境 KVM 从诞生开始就需要硬件虚拟化的支持,KVM 必需的硬件虚拟化扩展分别是:Intel 的虚拟化技术(Intel VT)和 AMD 的 AMD-V 技术.首先处理器(CPU ...
- 支持“ReportDbContext”上下文的模型已在数据库创建后发生更改
支持“ReportDbContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkI ...
- elk问题汇总
解决方案: https://blog.51cto.com/michaelkang/2298689?source=dra 使用postman. PUT请求, JSON格式
- 常见问题:计算机网络/运输层/UDP
几乎不对IP增加其他东西,无连接. 优势 速度快.适合实时. 无连接建立,没有连接时延. 无连接状态. 分组首部开销小.TCP需20字节,UDP仅需8字节. 使用UDP的协议 DNS SNMP RIP ...
- C++ 顺序容器(vector,list、deque,stack,queue)
顺序容器的种类有:vector,list.deque 顺序容器适配器: stack //先进后出 栈 queue //先进先出 队列 priority_queue //也优先管 ...
- mybatis+mysql insert添加数据后返回数据主键id---(转)
1.根据useGeneratedKeys获取返回值,部分数据库不支持 修改mybatis xml 1 2 3 <insert id="insertUser" useGener ...
- Mongodb索引实战
最近碰到这样的一个需求,一张酒店政策优惠表,我们要根据用户入住和离开的时间,计算一家酒店的最低价政策前10位,数据库表字段如下: 'hid':88, 酒店id 'date':20150530, 入住日 ...
- LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
108. 将有序数组转换为二叉搜索树 108. Convert Sorted Array to Binary Search Tree 题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索 ...