函数是JavaScript中最核心的或者说最难的部分,其本质是一段可重复执行的程序块。然而它并没有那么简单,因为函数在JavaScript中即可以是方法,也可以是类,还可以是对象,总之十分灵活,所以要悟透函数还的是一个潜移默化的过程。函数是JS模仿面向对象的个基石,要学好JS,学好流行的各种JS库,首先要过函数这一关。
函数的功能就是组织一块块代码,然后被其他地方调用,传统的函数只被拿来做一些极小的应用,因为其本身一直被当作过程化的语言使用。在Ajax流行以后,由于需要组织大量的代码,程序急需被模块化,各个模块之间又要相互协调工作,所以Javascript模仿了面向对象的手法,通过面向对象支持的三大特性封装,继承和;多态,使的一个个模块可以被反复使用。各类JS库也就是这么的诞生。 要把一块块代码封装起来便于使用,JS是通过函数来模仿类完成的这个过程的。所以函数是我们需要深究的东西。
要点:
1, 无名函数 ,有名函数的区别
func(); //此句报错
var func = function(){
alert(1);
}
func(); //正确
对于有名函数, 调用语句可以出现在定义函数之前或之后;
对于无名函数, 调用语句必须在定义函数之后;
2. 函数可以嵌套定义
function getNumbers(arr){
for(var i=0;i<arr.length; i++){
if(isNumber(arr )) alert(arr );
}
function isNumber(s) {
return typeof s == "number"
}
}
内部的函数只能在其外部函数的范围内被调用。
3. 函数名也是变量
它存储的是函数类型的数据,是一个特殊的变量。不属于Javascript的基本数据类型。也不可以和其他数据类型转换。可以通过typeof判断一个
变量是不是函数
alert(typeof getNumbers); //返回 "function"
既然函数是特殊的变量, 那么也可以把一个函数类型的变量值赋值给另一个变量,通过另一个变量名来进行函数访问
var aa = getNumbers;
alert(aa(["1",1]));
4, 函数与事件关联注意的问题
(1),执行关联函数
document.body.onload = function(){
alert(1);
}
(2), 通过函数名关联
document.body.onload = aa; //千万不能写成aa(); 这表示执行函数 把函数的结构赋值给onload事件
function aa(){
alert(1);
}
5、 函数传参可以按值传递和引用传递
按值传递 在函数体改变变量的值不会影响到调用方。
按引用传递, 在函数体改变变量的值会影响到调用方。
function func1(s){
s++;
alert(s);
}
var s =1 ;
func1(s); //输出2
func1(s); //输出1 说明只是简单的值拷贝
function func1(obj){
obj.flag ="aa";
}
var obj = new Object;
alert(obj.flag); //输出"undefined";
func1(obj);
alert(obj.flag); //输出"aa";
6, 函数命名冲突
有时候全局变量和函数内的局部变量同名,这个时候就发生了命名冲突的问题,当发生冲突时,
函数内部优先使用局部变量,对局部变量的操作不会影响到全局变量。
函数的功能就是组织一块块代码,然后被其他地方调用,传统的函数只被拿来做一些极小的应用,因为其本身一直被当作过程化的语言使用。在Ajax流行以后,由于需要组织大量的代码,程序急需被模块化,各个模块之间又要相互协调工作,所以Javascript模仿了面向对象的手法,通过面向对象支持的三大特性封装,继承和;多态,使的一个个模块可以被反复使用。各类JS库也就是这么的诞生。 要把一块块代码封装起来便于使用,JS是通过函数来模仿类完成的这个过程的。所以函数是我们需要深究的东西。
要点:
1, 无名函数 ,有名函数的区别
func(); //此句报错
var func = function(){
alert(1);
}
func(); //正确
对于有名函数, 调用语句可以出现在定义函数之前或之后;
对于无名函数, 调用语句必须在定义函数之后;
2. 函数可以嵌套定义
function getNumbers(arr){
for(var i=0;i<arr.length; i++){
if(isNumber(arr
}
function isNumber(s) {
return typeof s == "number"
}
}
内部的函数只能在其外部函数的范围内被调用。
3. 函数名也是变量
它存储的是函数类型的数据,是一个特殊的变量。不属于Javascript的基本数据类型。也不可以和其他数据类型转换。可以通过typeof判断一个
变量是不是函数
alert(typeof getNumbers); //返回 "function"
既然函数是特殊的变量, 那么也可以把一个函数类型的变量值赋值给另一个变量,通过另一个变量名来进行函数访问
var aa = getNumbers;
alert(aa(["1",1]));
4, 函数与事件关联注意的问题
(1),执行关联函数
document.body.onload = function(){
alert(1);
}
(2), 通过函数名关联
document.body.onload = aa; //千万不能写成aa(); 这表示执行函数 把函数的结构赋值给onload事件
function aa(){
alert(1);
}
5、 函数传参可以按值传递和引用传递
按值传递 在函数体改变变量的值不会影响到调用方。
按引用传递, 在函数体改变变量的值会影响到调用方。
function func1(s){
s++;
alert(s);
}
var s =1 ;
func1(s); //输出2
func1(s); //输出1 说明只是简单的值拷贝
function func1(obj){
obj.flag ="aa";
}
var obj = new Object;
alert(obj.flag); //输出"undefined";
func1(obj);
alert(obj.flag); //输出"aa";
6, 函数命名冲突
有时候全局变量和函数内的局部变量同名,这个时候就发生了命名冲突的问题,当发生冲突时,
函数内部优先使用局部变量,对局部变量的操作不会影响到全局变量。