1、调用函数
第一种调用方式
第二种调用方式
2、传递参数
第一种传递参数的方式
第二种传递参数的方式
3、返回值return
(1)函数通过return关键字可以把值返回给调用的地方。
函数的返回值 = = = 函数名加小括号
fn(); 函数名加小括号: 含义①调用函数;含义② 等于返回值
(2)函数中遇到return就终止函数的运行
(3)方法中无return返回值,方法中没有显示返回任何结果,那么返回的结果就是undefined。
4、全局变量和局部变量的作用域
(1)声明任何函数之外的变量是全局变量,在任何地方都可以使用。 全局变量的作用域 在全局中都能被访问,且只有在页面关闭后才被删除。
str定义在函数外部是全局变量
(2)声明在函数里面的变量是局部变量,只能在当前函数里面访问。局部变量的作用域,且在函数运行以后被立即删除,不能修改外部变量
const str = '我会好好学习的' 为局部变量
在函数内部声明的变量(必须使用var或let或const来定义一下),只能在函数内部访问它,★可以在不同的函数中使用名称相同的局部变量
(3)如果不使用var或let或const来定义一下,就会变成全局变量
总结:作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期,变量的作用域有两种, 全局作用域和局部作用域
5、作用域链
先从当前寻找,如果找不到就会一层一层向上寻找,直到找到,如果一直向上寻找也找不到,就会报错
就近原则,如果当前的作用域下,就存在变量,那么就优先找自己作用域下的变量
6、闭包函数
一函数就是一个闭包,闭包就是为了 访问函数内部的变量
在函数的内部,再定义一个函数,函数2被包括在1内部,1内部的所有局部变量,对2都是可见的,JS特有的"链式作用域"结构(父对象的所有变量,对子对象都是可见的,反之则不成立)把内部函数作为返回值
闭包的用途:★可以读取函数内部的变量,让这些变量的值始终保持在内存中
代码中的内部函数(f2)就是闭包,闭包就是能够读取其他函数内部变量的函数,可以把闭包简单理解成"定义在一个函数内部的函数",是将函数内部和函数外部连接起来的一座桥梁
为什么str会一直存在?
因为fn1中的变量str,一直在被fn2所引用,导致垃圾回收机制,回收不掉,所以str会一直存在
闭包的缺点:1、会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露
2、★闭包会在父函数外部,改变父函数内部变量的值
因为fn2 一直在使用num这个局部变量,导致num这个变量一直被垃圾回收机制所回收,所以全局函数add可以对num这个局部变量进行累加