1.函数实际上是对象
2.函数的定义:
1.函数申明语法定义:
function sun {
/*......*/
}
2.函数表达式定义:
var sun = function() {
/*......*/
};//函数末尾有分号,就像定义变量一样
3.函数对象的length属性是其声明的参数的个数
举个例子:
function a(b,c){
/*.....*/
}
a.length; //2
4.函数没有重载,函数提升
如果同时声明两个名字一样的函数,后一个会覆盖前一个函数
function sum(){
console.log(10)
};
sum();
function sum (){
console.log(20)
}
sum();
以上结果证实,函数无法重载,后一个会覆盖前一个;
可能会有人产生疑惑🤔,为什么第一sum()执行结果也是20,那是因为JS中的解析器会率先读取函数声明(也可以理解为函数声明提升)的过程;但是,函数表达式就没有这个待遇,它无法被JS引擎提升到顶部;
举另一个例子(用函数表达式定义函数):
var sum = function(){
console.log(10)
};
sum();
var sum = function (){
console.log(20)
}
sum();
结果如下:
这时两个sum()调用后,就呈现出不同的结果了。
5.根据属性名来创建一个比较函数
举个例子:
function createComparisonFunction(propertyName){
return function(object1,object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if(value1<value2){
return -1;
}else if (value1 > value2){
return 1;
}else{
return 0;
}
};
}
var data = [{name:"zzzzz",age:"11"},{name:"wef",age:"18"},{name:"wef",age:"10"}];
data.sort(createComparisonFunction("age"));
alert(data[0].age);
结果如下:
6.函数内部属性
在函数内部,有两个特殊的对象,arguments 和 this。
arguments:
其中arguments又一个叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数;
举个例子:
一般的阶乘函数(在函数体内调用函数本身):
function factorial (num){
if(num <= 1){
return 1;
}else{
return num * factorial(num-1);
}
}
console.log(factorial(3)); //6
利用 arguments.callee 的阶乘例子:
function factorial (num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
console.log(factorial(3));//6
this:
this 引用的是函数执行的环境对象(当在网页的全局作用域中调用函数时,this对象引用的就是windows)
一个例子:
window.color = "red";
var o = {color : "blue"};
function sayColor(){
alert(this.color);
}
sayColor();//red
o.sayColor = sayColor;
o.sayColor(); //blue
以上例子中,sayColor()是在全局作用域中定义的,它引用了this对象,所以this指向的是全局对象;换句话说“this.color”会被转换为"window.color";返回结果“red”; 而把这个函数赋值给对象o时,并调用o.sayColor() ,这里的this,color会转换成o.color;返回结果“blue” ;