如果是下面这个情况,会报错
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,前者是从前往后,后者是从后往前找
可以接受一个参数,表示查那个字母
也可以接受两个参数,第二个参数表示从哪个下标开始