函数
return 关键字
相当于我准备了一个返回结果,调用就是这个结果本身,如何使用,是你的事
function sum(num1, num2) { return num1 + num2; } console.log(sum(1, 5)); //6
return关键字,退出当前函数,后面的函数代码不再执行
严格模式对函数有以下限制
-
不能把函数命名为 eval 或 arguments; 不能把参数命名为 eval 或 arguments; 不能出现两个命名参数同名的情况
函数的参数
函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不 会有什么怨言。之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收 到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任 何元素,无所谓;如果包含多个元素,也没有问题。
arguments
表示函数参数的一个类数组,并且只能在海曙的内部访问
function sayHi() { alert("Hello " + arguments[0] + "," + arguments[1]); }
我们可以利用这一点为同一个函数实现不同的功能
function doAdd() { if(arguments.length == 1) { alert(arguments[0] + 10); } else if (arguments.length == 2) { alert(arguments[0] + arguments[1]); } } doAdd(10); //20 doAdd(30, 20); //50
函数的覆盖性
如果在 ECMAScript 中定义了两个名字相同的函数,则该名字只属于后定义的函数。请看下面的例子:
function addSomeNumber(num){ return num + 100; } function addSomeNumber(num) { return num + 200; } var result = addSomeNumber(100); //300
每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。ECMAScript 程序中的执行流正是由这个方便的机制控制着。
作用域链
作用域链的
作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能享受访问,访问到window对象即被终止。简单来说,作用域就是变量和函数的可访问范围
闭包
闭包指有权访问另一个函数内部变量的函数,当在函数内部定义了其他函数,也就创建了闭包
谈谈你对闭包的理解
优点:使用闭包可以模仿块级作用域,可以避免全局变量的污染,实现封装和缓存
缺点:闭包会常驻内存,造成内存泄露,解决方法是在退出函数之前,将不使用的局部变量设为null
闭包最大的两个作用
1.可以读取函数内部使用的变量,使这些变量始终保存在内存中.封装对象的私有属性,和私有方法