函数
定义:方法,封装特定功能的代码
- 构造函数(人为分类)
函数的本质区别在于函数的调用方式。如果使用new调用一个函数没那这个函数理解为构造函数;如果使用()调用,这个函数理解为普通函数。
不管是构造函数还是普通函数,在内存中都有两块空间,一块表示构函数本身,一块表示函数的原型。
- 构造函数
- 用于实例化对象,或者是为对象提供公共的方法。【对象可以调用构造函数原型中的方法】
- 为了区分普通函数,构造函数一般函数名首字母大写,Object 、Array
obj.toString();
- class
pojo类 用于保存属性- class
service类 用于方法封装- 普通函数
- 方法,实现特定功能
- 普通函数的函数名首字母小写
javascript new Object.prototype.toString();
- 创建函数
1)函数声明
函数的声明会被提升,所以可以在函数声明之前调用函数
function 函数名(形式参数) { }
例如:
// 函数定义
add(1,3); // 可以调用
function add(a,b){
var result = a + b;
return result;
}
// 调用add函数,并且将该函数的返回值返回给total变量
var total = add(1,2)
console.log("1+2 = ",total);
2)函数表达式
函数本质上就是一个特殊的值,这个值与普通对象一样,创建于堆区,函数名中保存的实际上是这个函数的引用地址。
无法在函数表达式之前调用函数,因为如果使用var声明函数,变量的声明会被提升,函数的值实际上为undefined,是无法调用undefined();
var 函数名 = function(形参){ }
bar(); // bar is not a function var bar = function(){ }
- 函数调用
1)函数名(实参) 调用完成后返回 函数的返回值
2) new 函数名(实参) , 认为当前函数为构造函数,调用完成后会返回一个新对象
var a = Number("12") // 函数,将"12"转换为数字,并且返回
var a = new Number("12") // 构造函数,将"12"作为参数,创建一个数字
3)函数名.call(this,实参列表) // this可以为任意值,表示为该函数中的this赋值
function add(a,b){
console.log(this); // {name:"terry"}
return a+b;
}
add.call({name:"terry"},1,2)
将1赋值给a,将2赋值给b。将{name:“terry”}复制给add的this
4) 函数名.apply(this,实参数组)
unction add(a,b){
console.log(this); // {name:"terry"}
return a+b;
}
add.apply({name:"terry"},[1,2])
将1赋值给a,将2赋值给b。将{name:“terry”}复制给add的this
- 函数内部属性
只有在函数执行的时候才能确定值的属性
形参:快捷接受实参的方式
arguments: 是类数组对象,是实参真正保存的位置。
var like_arr = {
"0":"terry",
"1":"larry",
"2":"jacky",
length:3
}
arguments.callee 表示当前函数
this: 当前函数的执行环境对象,与调用方式有关。
var foo = function(){
console.log("this",this);
}
var obj = {
name:"terry",
bar:foo
}
var arr = [1,2,3,foo];
- new foo(); this 指向新构建出来的对象
- foo (); this 全局对象,浏览器指向window ,nodejs 指向global
var foo = function(){
console.log(this);
}- obj.bar(); this 指向obj
- arr3; this 指向arr
- foo.call({name:“terry”}) this指向{name:“terry”}
- foo.apply({name:“terry”}) this指向{name:“terry”}
- 函数作为返回值
function foo(){
return function(){
return "hello world"
}
}
var result = foo()(); // result "hello world"