目录
预解析 (就近原则,js中代码,从上往下执行, 只会往上找,不会向下;往上找最近的数据)
什么叫函数
JS中可以把函数理解为一个代码容器,用于装代码; 封装一段可以被重复调用的代码块;
使用函数的目的: 让大量的代码重复使用,减轻重复编码的负担.
函数的封装: 把一个或多个功能通过函数的方式封装起来,对外提供一个借口 来调用函数;
函数的作用: 复用代码, 封装代码.
函数的定义
注:定义了一个函数,该函数不会执行,只有调用函数才会执行;
函数声明的时候,函数体并不会执行,只要当函数被调用的时候才会执行。
函数一般都用来干一件事情,函数名称一般使用动词
-
函数定义的方式
1. 函数声明 : 可以在任何地方调用这个函数; 既可以在函数声明之前(函数的提升); 也可以在声明代码之后;
- function 函数名 () { }
- // 定义函数
- function 函数名 {
- 函数体
- }
2. 函数表达式(匿名函数): 只能在定义函数完毕之后再调用这个函数
语法: var 变量名 = function() {} //var 变量名 是一个变量.
// 定义函数
var 变量名 = function() {
函数体
}
3. 构造函数式:
语法: var 变量名 = new Function(参数1,参数2,参数3,...函数体)
// 定义函数
var fun2 = new Function('console.log(10)')
函数的调用
- 调用函数的语法: 函数名() ; 通过函数名调用函数 ;可以调用多次(重复使用); 函数不调用;自己不执行;
//例如:
// 求1-100之间所有数的和
function getSum() {
var sum = 0;
for (var i = 1; i < 101; i++) {
sum += i;
}
console.log(sum);
}
// 调用
getSum();//5050
函数的参数
函数是一段代码的封装。
当函数执行的时候,函数体内的代码会执行。
我们可以传递一些数据参与运算。这个就是函数的参数。
函数的参数分为实参和形参。 实参传递给形参, 形参接受实参;
实参:函数调用的时候真实传递进去的数据,叫做实际参数,简称实参。
形参:函数定义的时候写在形参列表中的变量,叫做形式参数,简称形参。 (形参可以看做不用声明的变量, //undefined )
形参与实参的对应关系: 按照顺序,一一对应。
多个参数之间逗号隔开;
function 函数名(形参1, 形参2, 形参3...) {
// 函数体
}// 带参数的函数调用
函数名(实参1, 实参2, 实参3);
形参1 = 实参1
形参2 = 实参2
var x = 5, y = 6;
fn(x,y);
function fn(a, b) {
console.log(a + b); //11
}
// x,y实参, 有具体的值。函数执行的时候会把x,y复制一份给函数内部的a和b,函数内部的值是复制的新值,无法修改外部的x,y
函数体内有一个专属的关键字 return
当函数执行完的时候,并不是所有时候都要把结果打印。我们期望函数给我一些反馈(比如计算的结果返回进行后续的运算),这个时候可以让函数返回一些东西。也就是返回值。函数通过return返回一个返回值.
作用:
-
是向函数的调用处返回一个值
-
终止函数的执行
//声明函数 function qiuhe(a, b) { var result = a + b; return result; } //调用函数 var he = qiuhe(10, 20);
如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined;
如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值;
如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined;
函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。
函数都是有返回值的
1.如果有return则返回return后面的值;
2.如果没有return则返回undefined;
3. return只能返回一个值,返回的结果是 最后逗号后的值;
4.执行return语句之后,return后面的代码不再执行;
break,continue,return区别
arguments的使用
当不确定有多少个参数传递的时候,可以用arguments来获取。在JavaScript中,arguments实际上它是当前函数的一个内置对象。
所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
JavaScript中,arguments是 函数的一个内置对象。
所有函数都内置了一个arguments对象.
arguments对象中存储了传递的所有的实参。
arguments是一个伪数组,可以进行遍历.
匿名函数
匿名函数:没有名字的函数;
匿名函数如何使用:将匿名函数赋值给一个变量,这样就可以通过变量进行调用匿名函数自调用; == > 函数表达式
自调用函数
IIFE调用: 立即执行函数
(function () {})();
(function(){}())
----------------------------------------
(function () {
alert(123);
})();
函数是一种数据类型 //function
function fn() {}
console.log(typeof fn); //function
- 函数作为参数 ==> 回调函数
因为函数也是一种类型,可以把函数作为另一个函数的参数,在另一个函数中调用; 等主函数执行完了,在执行作为参数的函数;
- 函数做为返回值 ==> 闭包
因为函数是一种类型,所以可以把函数可以作为返回值从函数内部返回。
作用域
作用域:规定了变量和函数起作用的范围。
全局变量和局部变量
全局变量
-
在任何地方都可以访问到的变量就是全局变量,对应全局作用域;
- <script>标签之间属于全局作用域;不同的script标签共享同一个作用域,包括js文件;
- 在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)。
- 全局变量在代码的任何位置都可以使用
- 在全局作用域下var声明的变量是全局变量. var sum = 123;
- 特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用) a = 10;(不推荐)
- 不使用var声明的变量是全局变量,不推荐使用;
局部变量
- 只能在函数内部,访问到的变量; 对应局部作用域(函数作用域)
- 在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)
- 局部变量只能在该函数内部使用
- 在函数内部var声明的变量是局部变量,函数的形参实际上就是局部变量
- 特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用) a = 10;(不推荐)
全局变量和局部变量的区别
全局变量∶在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存;
局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间;
作用域链
- 只要是代码,就至少有一个作用域;
- 写在函数内部的局部作用域;
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;
- 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链; (就近原则, js中代码,从上往下执行, 只会往上找,不会向下;往上找最近的数据)
预解析 (就近原则,js中代码,从上往下执行, 只会往上找,不会向下;往上找最近的数据)
JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。
JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程:
- 变量提升: 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
- 函数提升: 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
- 先提升var,在提升function。
预解析,只会把变量的声明(不提升赋值), 函数的声明(整个函数的声明)提升; 剩下的按顺序接续书写;
(函数内部也有变量声明的提升,函数内部,没有var 的变量,直接赋值, 会变成全局变量;)