目录
一、函数表达式和函数声明的底层实现
1、函数声明:
function quack(num){
for(var i=0;i<num;i++){
console.log("quack!");
}
}
2、函数表达式(匿名函数)
var fly=function(num){
for(var i=0;i<num;i++){
console.log("quack!");
}
}
3、浏览器处理函数声明的流程:
- 扫描所有js代码,寻找函数声明
- 在内存中开辟一块区域,存储函数声明
- 创建一个和函数名同名的函数指针变量
- 将 函数声明 在内存中的首地址 赋值给 同名的函数指针变量。
- 回到js代码开头,从头到尾执行代码。遇到函数表达式
- 在内存中开辟一段内存 存储 匿名函数 的定义内容
- 将首地址赋值给 函数指针变量 fly。(函数表达式的返回值就是函数定义在内存中的首地址)
- 函数指针(地址) 加上 参数列表 即可调用对应函数。(函数名就是函数声明在内存中的首地址)
- console.log(函数指针) 在命令行中打印整个函数定义。
因此,函数声明可以放在任何地方,且可以在任何地方调用他们。但是函数表达式 必须 在 调用前 声明。在python中函数的定义必须放在函数调用之前,在C++中,如果想将函数定义放在调用之后,必须在调用前加上 函数原型。
4、将函数地址拷贝给函数指针变量的好处:
- 通过函数指针可以直接调用函数
- 将函数指针传递给 某个函数
- 某个函数可以返回函数指针。
5、使用函数声明和函数表达式的细微差别:
- 使用函数声明,函数将在 执行代码前 创建;
- 使用函数表达式,函数将在 运行阶段 执行代码时创建。
6、一等值:具有以下性质的值称为以一等值:
- 可以将其赋值给变量 或 存储在数组和对象等数据结构中
- 可以将其将其传递给函数
- 从函数中可以返回它们
函数表达式 是 一等值
var passengers = [
{ name:"shangrui1",paid:true,ticker:"firstclass"},
{ name:"shangrui2",paid:true,ticker:"superfirstclass"},
{ name:"zhangli",paid:true,ticker:"coach"},
{ name:"jiangjianmang",paid:true,ticker:"coach"},
{ name:"liuzhuahu",paid:true,ticker:"coach"},
];
function createDrinkOrder(passenger){
var orderFunction;
if(passenger.ticker === "firstclass"){
orderFunction = function(){
alert("Would you like a cocktail or wine");
};
} else if(passenger.ticker === "superfirstclass"){
orderFunction = function(){
alert("你想可乐 还是 葡萄酒?");
};
}
else{
orderFunction = function(){
alert("Your choice is cola or water.");
};
}
return orderFunction;
}
function serveCustomer(passenger){
var getDrinkOrderFunction = createDrinkOrder(passenger);
getDrinkOrderFunction();
getDrinkOrderFunction();
getDrinkOrderFunction();
}
function servePassengers(passengers){
for(var i=0;i<passengers.length;i++){
serveCustomer(passengers[i]);
}
}
servePassengers(passengers);
7.数组的sort方法
function compareNumbers1(num1,num2){
return num1-num2;//对应升序排序
}
function compareNumbers2(num1,num2){
return num2-num1;//对应降序排序
}
var numbersArray = [60,50,62,58,54,54];
numbersArray.sort(compareNumber1);
console.log(numbersArray);
如果数组中元素是对象,需要按照对象中的某个属性来排序,代码如下:
var products = [{name:"Grapefruit",calories:170,color:"red",sold:8200},
{name:"cola",calories:150,color:"red",sold:4200},
{name:"water",calories:130,color:"red",sold:3200},
{name:"fruit",calories:110,color:"red",sold:2200}
];
function compare(colaA,colaB){
return colaA.sold - colaB.sold;//按照sold 升序排序
}
products.sort(compare);
console.log(products);