Headfirst JS:函数是一等公民

目录

一、函数表达式和函数声明的底层实现

1、函数声明:

2、函数表达式(匿名函数)

3、浏览器处理函数声明的流程:

4、将函数地址拷贝给函数指针变量的好处:

5、使用函数声明和函数表达式的细微差别:

6、一等值:具有以下性质的值称为以一等值:


一、函数表达式和函数声明的底层实现

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、浏览器处理函数声明的流程:

  1. 扫描所有js代码,寻找函数声明
  2. 在内存中开辟一块区域,存储函数声明
  3. 创建一个和函数名同名的函数指针变量
  4. 将 函数声明 在内存中的首地址 赋值给 同名的函数指针变量。
  5. 回到js代码开头,从头到尾执行代码。遇到函数表达式
  6. 在内存中开辟一段内存 存储 匿名函数 的定义内容
  7. 将首地址赋值给 函数指针变量 fly。(函数表达式的返回值就是函数定义在内存中的首地址)
  8. 函数指针(地址) 加上 参数列表 即可调用对应函数。(函数名就是函数声明在内存中的首地址)
  9. console.log(函数指针) 在命令行中打印整个函数定义。

因此,函数声明可以放在任何地方,且可以在任何地方调用他们。但是函数表达式 必须 在 调用前 声明。在python中函数的定义必须放在函数调用之前,在C++中,如果想将函数定义放在调用之后,必须在调用前加上 函数原型。

4、将函数地址拷贝给函数指针变量的好处:

  1. 通过函数指针可以直接调用函数
  2. 将函数指针传递给 某个函数
  3. 某个函数可以返回函数指针。

5、使用函数声明和函数表达式的细微差别:

  • 使用函数声明,函数将在 执行代码前 创建;
  • 使用函数表达式,函数将在 运行阶段 执行代码时创建。

6、一等值:具有以下性质的值称为以一等值:

  1. 可以将其赋值给变量 或 存储在数组和对象等数据结构中
  2. 可以将其将其传递给函数
  3. 从函数中可以返回它们

函数表达式 是 一等值

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);

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值