JavaScript 函数
函数概念
函数是一块 JavaScript代码,被定义一次,但可执行和调用多次。JS中的函数也是对象,所以JS函数可以像其它对象那样操作和传递,所以我们也常叫JS中的函数为函数对象。
函数创建方法
函数声明
function func(){ //do something }
函数表达式
var func = function(){} //传入匿名函数
使用构造函数
var func = new Function('参数1','参数2','函数内部块'); //等价于 var func = Function() ;
不同创建方法,会有不同差别
//函数声明与函数表达式进行对比
var result = add(1,2) ;
console.log(result) //输出3
function add(a,b){
return a+b
}
//等价于
function add(a,b){
return a+b
}
var result = add(1,2) ;
console.log(result) //输出3
使用函数声明,可以进行函数提升,执行上下文之前,函数声明会提升到前面,可以直接进行调用
var result = add(1,2)
console.log(result) //报错,Uncaught TypeError: add is not a function
var add = function(a,b){
return a+b
}
//等价于
var add; //此时add刚刚被定义,值为undefined
var result = add(1,2);
console.log(result)
add = function(a,b){
return a+b
}
使用函数表达式创建函数,仅仅会把当前的变量进行提升,并不能对内部的匿名函数进行提升。
var result = add(1,2)
console.log(result) //报错,Uncaught TypeError: add is not a function
var add = new Function('a','b','return a+b');
//示例
var globalTime = 3;
(function(){
var time = 2;
var getTime = Function('return time') //undefined,无法访问到函数内部变量,却可以访问到全局变量(globalTime)
})
使用函数构造器构造函数时,函数也不会进行提升,不能访问到函数内部变量,可以访问全局变量。
函数属性与arguments
function foo(x,y,z){
arguments.length //实际传入两个形参 那么长度就是2
arguments[0] //返回1
arguments[0]=10
x //打印为10 (严格模式下赋值会失败)
arguments[2] = 20
z //打印为20
arguments.callee === foo //arguments下的callee属性指向函数本身(严格模式下不能使用)
}
foo(1,2)
foo.length // 函数的形参3个,所以长度为3
foo.name //名称foo
闭包
在函数作用域外,仍然能通过一种形式访问到函数内部的局部变量。
function caller(){
var abc = 111;
return abc
}
caller() ; // 111 此时只有调用函数的时候才能获取到abc的值
function caller(){
var abc = 111;
return function(){
return abc;
}
}
var func = caller();
func(); //可以获取到内部变量abc
闭包可以进行封装,灵活方便。但是容易造成空间浪费,内存泄漏,性能消耗等问题。
作用域
全局变量
var i = 0; function func(){ console.log(i) } func(); // 0 for(var j = 1 ; j<6;j++){ } console.log(j) // 1
局部变量
function foo(){ var i = 0; } console.log(i) //undefined //特殊例子 function foo1(){ var i = 0 ; var foo2 = new Function('console.log(i)'); foo2() } foo1() ; // undefined
eval() 内部声明的变量
利用函数作用域封装
(function(){
})()
//or
!function(){
}() //变成函数表达式