JavaScript之---function类型--学习笔记

21 篇文章 0 订阅
function类型
在ECMAScript中,Function(函数)类型实际上是引用类型,每个函数都是Function类型的对象,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的引用类型变量

1、函数的声明方式:
    ①普通的方式:function fun(num1,num2){
                                    return num1+num2;
                                }
    ②使用变量方式声明: var fun2 = function(a,b){
                                                            return a+b;
                                                        }
    ③使用new创建函数:var fun3 = new Function('n1','n2','return n1+n2');//不建议使用,js引擎需要解析2次 首先解析语法,之后解析参数,功能。运行起来性能较低,这种写法更能直观的看出函数是引用类型


函数作为参数如何传递:
ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
function add(a,b){
    return a+b;
}
function show(fun,num){
   retrun fun(num,88);
}
    show(add,66);

函数内部属性:
1、arguments属性:指向一个类似数组但不是数组的对象, 存储的是实际传递给函数的参数(hi就存在了函数内部的arguments当中) ,而不局限于于函数声明所定义的参数列表
function show(a,b)
{
    //alert(arguments.length);//内部存储数据的个数(传参个数  //从1开始)
    if(arguments.length == 2)
        alert(a+b);
    else if(arguments.length == 3)
        alert(arguments[0] + arguments[1] + arguments[2]);//虽然表示的方式与数组一样,但是arguments不是数组
}
show("hi","world","hello");

2、length属性: 函数定义时 所指定参数的个数
函数名.length    如上例子:alert(show.length);//显示2  (显示的是show(a,b)a,b 两个参数,所以长度为2)

3、arguments中的callee属性:它表示对函数对象本身的引用
         arguments指定的是一个对象,对象中还可以有属性
//使用递归求阶乘
function jie(){
    if(n=1)
        return 1;
    else
        return n+arguments.callee(n-1);//callee实际上是个引用,引用指向对象,他默认指向这个函数本身,她所在的函数对象,就相当于写函数名(n+jie(n-1);这样写的话当函数名发生变化时这里自身调用的函数名也要改变)
好处:如果函数名发生变化,调用自身语句不用改,更加方便不易出错

4、局部变量和全局变量
var b =88;//在函数外定义的变量,为全局变量,他是公共的,任何一个函数都可以使用。
function fun(){
        var a = 66;//局部变量,只能被其所在的函数使用
        var b = 99;//局部变量和全局变量同名时,全局变量无效
}
fun();

5、this : 是一个引用类型的变量,指向函数被调用时的对象(这个函数是哪个函数调用的,this就指向哪个对象,它内部自动变化
 var name = "zhangsan";
function show(){
    alert(name);
}
show();//window对象调用的(window对象是js中最顶层的对象 已经创建好存在的对象最大的对象相当于window.show()   window可省略  this指向的就是window对象)
var obj = {
        name:"lisi",
        show:function(){
                        alert(this.name);//相当于obj.name
                  }
    }
obj.show();//this指向的是obj对象,this是动态变化的

var color="red";
function fun(){
        alert(this.color);
}
var objs ={
            color:"blue";
        };
fun();//默认为window.fun()   注意时刻不同this的指向不同  这个时候this指向的是window对象,指向   fun(){
        alert(window.color);//显示的是红色 }

objs.showColor = fun;//给对象objs添加一个showColor方法并赋值为fun函数
objs.showColor();//这个时候调用objs中的  this此时指向的是objs这个对象 fun(){ alert(obj.color);}(显示蓝色)

6、函数内部方法call()  apply()【Function内部有一个prototype属性,该属性含有两个方法call() apply()】

function sum(num1,num2){
    return num1+num2;
}
function show1(num1,num2){
    return sum.call(this,num1,num2);//函数名.call(第一个参数是调用sum函数的对象,后边的参数是传递给sum函数实际数据)  
}
function show2(num1,num2){
    return sum.apply(this,[num1,num2]);// 第一个参数是调用sum函数的对象,this所指向的对象去调用,,后边的参数是传递给sum函数实际数据) 
}
// call()  apply()区别:传参方式不同
//sum.call(this,num1,num2);  
//sum.apply(this,[num1,num2]);

alert(show1(10,10));//window调用的show1,this指向的是window对象
alert(show2(10,10));//window调用的show2,this指向的是window对象

// 可以使用call()  apply()方法改变调用函数的对象
function test(){
    this.property ="hello world";
}
test();//this指向了window
alert(window.property);//显示的是hello world
var obj1={};
    test.call(obj1);//this指向的是obj1  
alert(obj1.property);//显示的是hello world



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值