javascript学习笔记——js的函数

时间 : 14-03-05 评论 : 0 点击 : 590 次

因为要转行做前端开发了,虽然之前也有写过js,但用的比较简单,没有深入学习,现在开始系统学习js。

本文主要介绍1、js函数是什么?2、函数声明与函数表达式;3、js函数参数问题;4、函数中的this对象。

一、函数是什么?

函数实际上是对象,都是Function类型的实例,函数名其实是一个指向函数对象的引用类型变量(可以理解为指针)

可以这样定义函数var sum = new Function(“sum1”,”sum2”,”return sum1+sum2;”);

等价于函数声明

function sum(sum1, sum2){

return sum1 + sum2;

}

等价于函数表达式

var sum = function(sum1, sum2){

return sum1 + sum2;

}

二、函数声明与函数表达式

解析器会在执行任何代码之前,先读取函数声明。对于函数表达式,则不会预先读取。因此,前面的代码可以调用后面用声明方式定义的函数,但是不能调用函数表达式定义的函数。

f1(1,2);//ok

f2(1,2);//undefined

function f1(sum1, sum2){

return sum1 + sum2;

}

var sum = f2(sum1, sum2){

return sum1 + sum2;

}

 

三、js函数参数问题

js函数调用时,传递的参数个数可以多于或者少于函数声明中定义的参数个数,每个函数都有个length属性,length等于函数声明中定义的参数个数。如果传递的参数个数少于定义的参数个数,则后面的参数的值为undefined。如果传递的参数个数多于定义的参数个数,可以通过函数内置的arguments对象访问。实际传递的参数个数通过arguments.length访问,参数通过数字下标访问(arguments[0],arguments[1]...),arguments拥有一个callee属性,该属性指向拥有arguments这个对象的函数的,在递归调用函数时可以用来取代函数名。

 

js不支持函数重载

所谓函数重载,是指可以定义几个功能相近的同名函数,通过传递参数的个数/类型不同来区分

C++中,支持函数重载是通过这样的一种方式实现的:

假如有两个函数

int fun(int a, int b){return a+b;}   int fun(int a, int b, int c){return a+b+c;}

则编译器存储的函数名是fun_int_intfun_int_int_int(可以这么理解,编译器不一定是这样实现的),调用时根据参数的类型和个数拼装成要调用的实际函数。

前面讲过了,js调用函数时不要求传递的参数个数和函数定义的参数个数一致,同时对于参数类型也没有要求,因此无法像C++那样去通过参数不同来实现重载,也没有必要实现重载。

如果定义了两个变量个数不同的同名函数,第二个函数就会覆盖第一个函数,记住,函数名是一个指针,定义了两个同名函数,则意味着声明了两个函数对象,而函数名作为一个指针,从指向第一个函数改为了指向第二个函数。

四、this对象

函数是对象,每个函数都有一个this对象,this对象是函数执行时所处的作用域(有人认为该说法不准确)。

在全局环境中调用函数,函数的this对象等于window

function f(){

if (this === window){

console.log('this === window');

}

else if (this === o){

console.log('this === o');

}

}

f();chrome会打印出this === window,说明thiswindow是同一个对象

 

var o = new Object();

o.f = f;

o.f();chrome会打印出this === o,说明thiso是同一个对象

f.apply(o);chrome会打印出this === o,说明thiso是同一个对象

 

每个函数都有方法,applycall

applycall都被用来调用函数本身,这两个函数都要指定函数的this对象

如:f.apply(o),调用f函数,并且指定f函数内的this对象为o

applycall的区别在于传递函数参数的区别,apply传递数组作为参数,call则一个个参数传递

f.apply(o, [a1,a2]);   f.call(0, a1, a2);

javascript

本文标签

javascript学习笔记——js的函数:等您坐沙发呢!

发表评论