本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
函数
函数
函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块
函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用
声明(定义)一个完整函数包括关键字、函数名、形式参数、函数体、返回值5个部分
函数使用
// 1 声明函数
function 函数名(){
函数体
}
// 2. 函数调用
函数名()
function eatMango(eat){
let str = eat +'芒果';
return str;
}
document.write(eatMango('吃')); //吃芒果
声明(定义)的函数必须调用才会真正被执行,使用
()调用函数。注:函数名的命名规则与变量是一致的,并且尽量保证函数名的语义。
注意:一般我们不在函数内部处理数据(打印操作等..)用return让数据作为返回值让调用者处理数据
函数封装
就是把一个或者多个功能通过函数封装起来,对外只提供一个简单的函数接口。也就是吧这些功能写在函数体里面,当我们使用时直接调用函数。
函数传参
形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
function 函数名(形参1,形参2...) { // 在声明函数的小括号里面是 形参 (形式上的参数)
//函数体
}
函数名(实参1,实参2...); // 在函数调用的小括号里面是实参(实际的参数)
// 传递多个参数 参数之间使用逗号隔开
function eatMango(eat){ //这里的eat是形式参数
let str = eat +'芒果';
return str;
}
document.write(eatMango('吃')); //这里函数调用时传入实参 '吃',所以打印结果就是 '吃芒果'
函数传参-参数默认值
形参:可以看做变量,但是如果一个变量不给值,默认就是undefined
参数默认值只会在缺少实参参数传递时 才会被执行,所以有参数会优先执行传递过来的实参, 否则默认为 undefined
函数返回值
当调用某个函数,这个函数会返回一个结果出来,这就是有返回值的函数
函数的本质是封装(包裹),函数体内的逻辑执行完毕后,函数外部如何获得函数内部的执行结果呢?要想获得函数内部逻辑的执行结果,需要通过 return 这个关键字,将内部执行结果传递到函数外部,这个被传递到外部的结果就是返回值。
function eatMango(eat){
let str = eat +'芒果';
return str;//这个str就是函数的返回值
}
document.write(eatMango('吃'));
- 在函数体中使用return 关键字能将内部的执行结果交给函数外部使用
- 函数内部只能出现1 次 return,并且 return 下一行代码不会再被执行,所以return 后面的数据不要换行写
- return会立即结束当前函数
- 函数可以没有return,这种情况默认返回值为 undefined
作用域
在不同位置声明的变量不是在各个地方都可用的,我们把变量的作用范围叫做作用域
作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
全局作用域
作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件
处于全局作用域内的变量,称为全局变量全局变量的作用域就是全局
局部作用域
作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。
处于局部作用域内的变量称为局部变量
- 全局作用域:整个script标签或者单独js文件 页面的任何地方都可以使用(全局变量)
- 局部作用域: 在函数内部声明,只能在函数内部使用 (局部变量)
- 块级作用域: 在大括号里面声明的变量(分支和循环),只能在大括号内部使用 必须是let const声明的变量
let like = '吃';//全局变量
function eatMango(eat){ //局部变量
let str = eat +'芒果'; //str 局部变量
return str;//这个str就是函数的返回值
}
document.write(eatMango(like));
如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐使用知道就行
但是有一种情况,函数内部的形参可以看做是局部变量。
变量访问原则
写在函数内部的局部作用域
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
访问原则:在能够访问到的情况下 先局部,局部没有在找全局
let like = '肉';
function eat(){
let like = '芒果';
console.log(like);
}
eat();//芒果
console.log(like);//肉
匿名函数
函数可以分为具名函数和匿名函数
匿名函数:没有名字的函数,无法直接使用。
//函数表达式
let fn = function (x, y) {
// console.log('我是函数表达式')
console.log(x + y);
}
fn(3, 4);
console.log(fn); //函数
//具名函数就是上边的正常函数 function eat(){}
立即执行函数
场景介绍: 避免全局变量之间的污染
第一种写法: (function(){})()
第二种写法: (function(){}())
// 第一种写法
(function (x, y) {
let arr = [];//不影响全局环境
let num =10;
console.log(x + y);
})(1, 2);
// 2.第二种写法
(function (x, y) {
let arr = [];
console.log(x + y);
}(1, 3));
//立即执行函数会立即执行
逻辑中断
短路:只存在于 && 和 || 中,当满足一定条件会让右边代码不执行
| 符号 | 短路条件 |
|---|---|
| && | 左边为false就短路 |
| || | 左边为true就短路 |
// &&左边为true就执行右边,为false执行左边
// || 左边为false就执行右边,为true执行左边
console.log(0&&5); //0
console.log(5&&55);//55
console.log(0&&5);//5
console.log(5||55);//5
转换为Boolean型
隐式转换:
1.有字符串的加法 "" + 1 ,结果是 "1"
2.减法 - (像大多数数学运算一样)只能用于数字,它会使空字符串 "" 转换为 0
3.null 经过数字转换之后会变为 0
4.undefined 经过数字转换之后会变为
NaN
console.log(Boolean('Mango'));//字符串的boolean值为true
console.log(Boolean('')); //空字符串的boolean值为false
console.log(Boolean(0)); //0的boolean值为false
console.log(Boolean(5)); //正数的boolean值为true
console.log(Boolean(-5)); //负数的boolean值为true
console.log(Boolean(undefined));//undefined的boolean值为false
console.log(Boolean(null)); //null的boolean值为false
console.log(Boolean(NaN)); //NaN的boolean值为false
\