计算机视觉技术 vue组件 javascript class eloquent parameters count jwt nginx教程视频 jquery去掉空格 jquery事件绑定 linux查看mysql进程 arduino程序 coreldraw学习 oracle可视化工具 oracle时间格式化 数据库学习 python3基础教程 python加法 python字典类型 python语言编程入门 java编程课程 java语法 java安装配置 java怎么编译 java实现队列 java接口实例 行业软件下载 超级煎蛋卷 忧思华光玉 typemonkey 苹果手机老是自动重启 cf透视辅助 凤凰刷机 excel应用大全 git命令 保留小数点后两位 工程html加密 华为手机刷公交卡 任意屏官网
当前位置: 首页 > 学习教程  > 编程语言

函数对象 - (name、length、自定义属性)、命名函数表达式

2020/12/5 10:07:18 文章标签:

函数对象 属性name:可以获得函数的名字属性length:返回函数入参的个数 1.rest参数不参与计数 例: 下面的代码中函数 ask 接受一个询问答案的参数 question 和可能包含任意数量 handler 的参数 …handlers。 当用户提供了自己的答案后&#x…

函数对象

  • 属性name:可以获得函数的名字
  • 属性length:返回函数入参的个数
    1.rest参数不参与计数
    例:
    下面的代码中函数 ask 接受一个询问答案的参数 question 和可能包含任意数量 handler 的参数 …handlers。
    当用户提供了自己的答案后,函数会调用那些 handlers。我们可以传入两种 handlers:
    一种是无参函数,它仅在用户回答给出积极的答案时被调用。
    一种是有参函数,它在两种情况都会被调用,并且返回一个答案。
function ask(question, ...handlers) {
  //idYes有两种取值:true或false
  let isYes = confirm(question);

  for(let handler of handlers) {
    if (handler.length == 0) {
      if (isYes) handler();
    } else {
      handler(isYes);
    }
  }

}

// 对于积极的回答,两个 handler 都会被调用
// 对于负面的回答,只有第二个 handler 被调用
ask("Question?", () => alert('You said yes'), result => alert(result));
  • 自定义属性
    counter属性,用来跟踪总的调用次数
function sayHi() {
  alert("Hi");

  // 计算调用次数
  sayHi.counter++;
}
sayHi.counter = 0; // 初始值

sayHi(); // Hi
sayHi(); // Hi

alert( `Called ${sayHi.counter} times` ); // Called 2 times
属性不是变量
属性 counter 和变量 let counter 是毫不相关的两个东西。

函数属性有时会用来代替闭包

function makeCounter() {
  // 不需要这个了
  // let count = 0

  function counter() {
    return counter.count++;
  };

  counter.count = 0;

  return counter;
}

let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1

//如果属性是绑定到函数的,就可以很容易访问到这个属性
counter.count = 10;
alert(counter());   //10

命名函数表达式

特点:

  • 它允许函数在内部引用自己
  • 它在函数外是不可见的
// 给函数表达式起了一个名字func
let sayHi = function func(who) {
  if (who) {
    alert(`Hello, ${who}`);
  } else {
    func("Guest"); // 使用 func 再次调用函数自身
  }
};

sayHi(); // Hello, Guest

// 但这不工作:
func(); // Error, func is not defined(在函数外不可见)

如果使用sayHi进行嵌套调用,有可能会报错,因为sayHi的值可能会被函数外部的代码改变

let sayHi = function(who) {
  if (who) {
    alert(`Hello, ${who}`);
  } else {
    sayHi("Guest"); // Error: sayHi is not a function
  }
};

let welcome = sayHi;
sayHi = null;

welcome(); // Error,嵌套调用 sayHi 不再有效!

习题

1.修改 makeCounter() 代码,使得 counter 可以进行减一和设置值的操作:

  • counter() 应该返回下一个数字(与之前的逻辑相同)。
  • counter.set(value) 应该将 count 设置为
    value。
  • counter.decrease(value) 应该把 count 减 1。
function makeCounter() {
  //在外部不需要使用count,所以不用写到属性上
  let count = 0;

  function counter() {
    return count++;
  }
  
  //在外部要用到set和decrease方法,所以写到counter的属性上
  counter.set = value => count = value;
  counter.decrease = () => count--;

  return counter;
}

2.任意数量的括号求和
写一个函数 sum,它有这样的功能:

	sum(1)(2) == 3; // 1 + 2
	sum(1)(2)(3) == 6; // 1 + 2 + 3
	sum(5)(-1)(2) == 6
	sum(6)(-1)(-2)(-3) == 0
	sum(0)(1)(2)(3)(4)(5) == 15

代码:

function sum(a) {

  let currentSum = a;
/*————————————————————————————*/
  function f(b) {
    currentSum += b;
    //返回f
    return f;
  }
  
  //因为要输出,所以从写toString()方法
  f.toString = function() {
    return currentSum;
  };
  
  //返回的是函数f
  return f;
 /*————————————————————————————*/
}

alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15

本文链接: http://www.dtmao.cc/news_show_450161.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?