函数的声明
1、function命令
带方法名的函数
2、函数表达式
var print = function(){}
将匿名函数赋值给变量
3、Function构造函数
var add = new Function(‘x’,‘y’,‘x+y’);最后一个参数是方法体,其余的都是参数
等同于function add (x,y){
return x+y;}
如果一个函数被重复声明,后面的函数会覆盖前面的函数
圆括号运算符
函数的提升,会将函数的定义提升到加载js页面的时候,如果页面里有赋值语句声明的函数,以赋值语句声明的函数为准
函数的名称和参数个数
function f(x,y){}
f.name //f
f.length //2
函数toString
会将函数全部内容打印出来
function f(x,y){}
console.log(f.name);
console.log(f.length)
console.log(f.toString())
var 在函数内部有效 在其余地方都是全局变量 在函数内部也会被提升
参数
参数的省略 会省略后面的参数,解析为undefined
参数的传递 函数体外定义参数(数值、布尔、字符串) 在函数体内使用后 不影响函数体外的参数值
如果是对象,在函数内修改对象的部分属性,会影响函数外定义的对象的属性值
如果修改整个对象的值,那么不会影响函数外部对象的值
同名参数,取后一个
arguments包含了函数运行时的所有参数,正常模式下,可以使用arguments修改参数值,使用arguments.length可以知道具体传进来几个参数
arguments是一个对象,并不是一个数组
将arguments转为数组
var arg = Array.prototype.slice.call(arguments);
prototype运行向Array()中添加新的属性和方法
slice截取数组的开始位置和结束位置,开始位置为必填,结束位置可以填可以不填,如果结束位置超过数组长度或者不是数字,那么截取到数组的长度位置
call编写能够在不同对象上使用的方法,调用所有者对象作为参数的方法
函数闭包
子级可以一级一级向上找父级,而父级不可以去找子级
function Person(name) {
var _age;
function setAge(n) {
_age = n;
}
function getAge() {
return _age;
}
return {
name: name,
getAge: getAge,
setAge: setAge
};
}
var p1 = Person(‘张三’);
p1.setAge(25);
p1.getAge() // 25
闭包会保留外层函数的内部变量,消耗很大。不要滥用闭包,会造成网页性能问题。
立即调用的函数表达式(IIFE)
(function(){})();函数定义后立即被执行,一般使用在匿名函数中,避免起名字污染全局变量
eval命令:接受一个字符串作为参数,并将这个字符串当作语句执行起来,如果参数字符串无法当作语句执行,则会报错;如果不是字符串,会原样返回。eval没有作用域,因此会修改全局变量,造成不安全因素,因此尽量避免使用。最常见的使用场景为解析json,但正常应该使用JSON.parse方法。