1、函数的介绍
函数的作用:
功能的封装,直接调用,代码复用率的提高,构造函数。
函数:
函数实际上是对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法,以及由于函数是对象,所以函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。
2、函数的声明
有两种方式(两种方式都可)
function 函数名(形参列表){
//函数体
}
var 函数名 = function(形参列表){
//函数体
}
函数声明和var声明类似,会进行提升:
function add(a,b){
var result = a + b;
return result;//返回值//返回执行的结果给被调用的
}
var total = add(1,2)
foo();//函数声明提升到代码的最前边,可以直接调用函数
function foo(){
console.log("hell world");
//return;
//console.log("1");//return之后的语句不执行
//如果没有返回的内容,则在写代码的时候不关注返回值
//没有return:代码执行到大括号
}
//变量声明提升 变量声明提升到代码的前边,函数声明之后正常代码之前
console.log(a); //undefined 这里不报错,因为后边有var a的声明。变量的声明进行提升到前边
var a = 'hello';
console.log(a); //'hello'
3.函数内部属性
只有在函数内部才能访问的属性。this也可以在函数外部进行使用。
arguments
ECMAScript函数的参数与大多数其他语言中的函数的参数有所不同,ECMAScript函数不介意传递参数的个数以及参数类型,这是因为函数的参数在函数内部是使用一个类数组对象来表示的。这个类数组对象就是arguments。
arguments是一个类数组对象,包含着传入函数中的所有参数。arguments主要用途是保存函数参数,但是这个对象还有一个名为callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
//length声明时希望的参数的个数
function add(a,b){
var result = a + b;
return result;
}
console.log(add.length);//表示函数希望接受的命名参数的个数,即形参的个数。
Object.getOwnPropertyDescriptor(add,'length');
add(22,42,12,44);
/*参数:接收实参的快捷方式
函数外部:实参保存的就是原始数据
函数内部:arguments保存真正的实参
*/
/*arguments类数组对象
arguments={
“0”:1,
“1”:33,
“2”:”zs”
};
arguments[0],arguments[“1”]
*/
function add(a,b){
console.log(arguments[0],arguments[1],arguments[2],arguments[3]);
console.log(a+b);
}
add(10);
//10 undefined undefined undefined
//NaN
add(10,20);
//10 20 undefined undefined
//30
add(10,20,30);
//10 20 30 undefined
//30
add(10,20,30,40);
//10 20 30 40
//30
callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。
callee 属性的初始值就是正被执行的 Function 对象。
// 实现匿名的递归函数
var sum = function (n) {
if (n == 1) {
return 1;
} else {
return n + arguments.callee(n - 1);
}
}
console.log(sum(6));//输出结果:21
this
面向对象语言中 this 表示当前对象的一个引用。
但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。
在方法中,this 表示该方法所属的对象。
如果单独使用,this 表示全局对象(global: 指向浏览器window)。
在函数中,this 表示全局对象。
在事件中,this 表示接收事件的元素。
在显式函数绑定时,我们可以自己决定this的指向
实例
var person = {
firstName: "LeBron",
lastName : "James",
id : 8888,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
方法中的 this
在对象方法中, this 指向调用它所在方法的对象。
在上面一个实例中,this 表示 person 对象。
fullName 方法所属的对象就是 person。
单独使用 this
<单独使用 this,则它指向全局对象。
在浏览器中,window 就是该全局对象为 [object Window]:
在node中,指向的是一个{}