javascript高级程序设计第三版 第五章 引用类型

5 引用类型

5.1 Object类型

//第一种创建方式 new后加构造函数
var person=new Object();
person.name="xxx";

//第二种 对象字面量
var person={
    name:"x"
};

//访问方式
person.name
person["name"]

5.5 Function类型

每个函数都是Function类型的实例,与其他引用类型一样具有属性和方法。函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

没有重载

5.5.2 函数声明与函数表达式

//函数声明
alert(sum(10,10));  //可运行
function sum(num1,num2){
  ..
}

//函数表达式
alert(sum(10,10));  //报错
var sum = function (num1,num2){
  ..
}

5.5.4 函数内部属性

函数内部的两个特殊对象:arguments和this。
arguments主要用途是保存函数参数,但还有一个叫callee的属性,指向拥有这个arguments对象的函数。

function factorial(num){
    if(num<1){
        return 1;
    }else{
        //return num*factorial(num-1);
        return num*arguments.callee(num-1);//相同效果且可以解耦,不必依赖函数名
    }
}

this引用的是函数执行的环境对象,运行时决定this的值。

window.color="red";
var o={color:"blue"};

function sayColor(){
    alert(this.color);
}

sayColor();//red

o.sayColor=sayColor;
o.sayColor();//blue

函数对象的属性:caller

function outer(){
    inner();
}

function inner(){
    //alert(inner.caller);
    //相同效果,但严格模式下不可用
    alert(arguments.callee.caller);
}

outer();//弹出outer()

5.5.5 函数属性和方法

函数包含两个属性:length和prototype
length:函数希望接收的命名参数的个数
prototype:保存它们所有实例方法的真正所在,非常重要

函数包含两个非继承而来的方法:apply()和call(),用途是在特定作用域中调用函数,实际上等于设置函数体内this的值。

apply()接收两个参数,1是运行函数的作用域,2是参数数组,可以是Array实例或arguments对象

function sum(num1,num2){
    return num1+num2;
}

function callSum1(num1,num2){
    return sum.apply(this,arguments);
}


function callSum2(num1,num2){
    return sum.apply(this,[num1,num2]);
}
alert(callSum1(10,10));//callSum1在全局作用域中调用,因此在执行sum函数时传入this作为this值,即传入的就是window对象
alert(callSum2(10,10));

function callSum(num1,num2){
    return sum.call(this,num1,num2);
}

call()方法与apply()方法作用相同,区别在于接收参数方式不同。第一个仍然是this值,其余参数都必须逐个列举出来直接传递给函数

call和apply的真正用途是,扩大函数赖以运行的作用域。好处是对象不需要与方法有任何耦合关系。

bind(),这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

window.color="red";
var o={color:"blue"};
function sayColor(){
    alert(this.color);
}
var objectSayColor=sayColor.bind(o);
objectSayColor();//"blue"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值