JavaScript高级程序设计第5章(3)

如果是下面这个情况,会报错
alert(sum(2,3));
var sum = function(num1,num2){
return num1+num2;
}

作为值的函数
例子:
funciton add10(num){
return num+10;
}

var result1 = callSomeFunction(add10,10);
alert(result1);

要访问函数,而不执行函数,必须去掉函数名后面那对圆括号

有个函数比较好用

例子:
function compare(propertyName){
return function(object1,object2){
if(object1[propertyName] < object2[propertyName]){
return -1;
}else if {(object1[propertyName] > object2[propertyName]){
return 1;
}else{
return 0;
}
}

var personArray = [{name:“lala”,age:20},{name:“haha”,age:25}];

personArray.sort(compare(“age”));
alert(personArray[0].name); //lala

在函数里面访问对象的属性的时候,用[],不要用.点

函数指针:

每个函数都有一个arguments,这个arguments有个属性callee指针,指向这个函数

看这个例子:
function factorial (num){
if (num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}

var newFunction = factorial;
factorial = function(){
return 0;
}

alert(newFunction(5)); //显示120
alert(factorial(5)); //显示0

如果把arguments.callee换成factorial,那么两次都显示为0

this指针:跟C的一样,但是当在网页的全局作用域中调用函数时,this对象引用的是window
还是举个例子:
window.color = “red”;

var o = {color:“blue”};

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

sayColor(); //red

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

caller,在一个函数A 调用另一个函数B时,被调用函数B会自动生成一个caller属性,指向调用它的函数对象即函数A。如果该函数A当前未被调用,则caller为null。
callee,callee是arguments对象的一个成员,它的值为“正被执行的Function对象”

函数属于对象,所以函数也有属性和方法,
属性:length(写函数的时候需要的参数有多少个,那么length就返回多少个)
prototype是保存所有实例方法的真正所在,在ECMAScript中,prototype属性是不可枚举的,不能用for-in 来弄

方法:每个函数都包含两个非继承而来的方法,apply和call
其中:apply函数有两个参数,一个是this,一个是argument

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

可以改成这样写
function callsum1(num1,num2){
return sum.apply(this,arguments);
}

或者
function callsum2(num1,num2){
return sum.apply(this,[sum1,sum2]);
}

对于call方法,与apply方法一样,只是只能这样写:
function callsum3(num1,num2){
return sum.call(this,num1,num2);
}

实际上,我们日常用它是这样用的(扩充作用域),对象与方法不需要任何关系

window.color = “red”;

var o = {color:“blue”};

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

sayColor(); //red
sayColor.call(this); //red
sayColor.call(o); //blue

还有另外一个方法:bind()

window.color = “red”;

var o = {color:“blue”};

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

var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue

字符串,是一个基本类型,不是引用类型,而String是字符串的一个引用类型,也叫基本包装类
例子:
var s1 = “aaaa”;
var s2 = s1.substring();
我们知道基本类型是没有属性和方法,但是这里为什么可以有呢?原因就是s1.substring()这一小句,系统为我们做了这些事情
var s = new String(“aaaa”);
然后调用s.substring

如果我们使用
var s1 = new String(“aaaa”);
var s2 = s1.substring();
也是完全没问题的,只不过系统不是自动帮你做刚刚的事情,而是你自己已经做完了这些事情

那么这两者的区别是,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之后都一直保存在内存之中,而二则,即系统帮我们做,那么执行完一句之后就销毁了

例子:
var s1 = “some”;
s1.color = “blue”; //系统帮我们做了var s1 = new String(“som”); s1.color=“blue”;
alert(s1.color); //结果首先是undefined,原因的话,在上一句系统做完之后就销毁了,到了这一句,系统又帮我们做一次var s1 = new String(“some”); 但是发送s1.color没定义的,根本上来说,第二句和第三句的系统为我们创建的s1是不同的

Object构造函数像一个大工厂,根据传入的值返回一个基本包装类
例子:
var obj = new Object(“some”);
alert(obj instanceof String); //true

需要注意的是,使用new调用基本包装类型的函数函数,与直接调用同名的转型函数是不一样的

var num = 25;
var num1 = Number(num);
alert(typeof num1); //number,基本类型

var num = 25;
var num1 = new Number(num);
alert(typeof num1); //object,基本包装类型

Number类型有toString方法,可以返回字符串类型的进制转换
例子:
var num = 10;
alert(num.toString(16)); //“a”

还有格式化的函数toFixed(),采用的是四舍五入的方法,很适合处理货币
例子:
var num1 = 11;
alert(num1.toFixed(3)); //11.000

最后String类型是字符串的对象包装类
例子:
var s1 = new String(“some”);
String类型的有几个好用的方法:

1.charAt(1)定位位置为1的字符是什么
当然我们也可以用[]来访问字符
alert(s1[2]); //m

2.concat之后接多少个参数都没问题
var s2 = “Hello”;
var s3 = s2.concat(“World”,"!");

3.slice()、substring()方法功能都是一样,截取字符串
例子:
var s4 = “abcde”;
alert(s4.slice(2)); //cde
alert(s4.slice(3,4)); //d 这个是左开右闭

4.indexOf,lastIndexOf,前者是从前往后,后者是从后往前找

可以接受一个参数,表示查那个字母
也可以接受两个参数,第二个参数表示从哪个下标开始

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值