我是靠谱客的博主 紧张小鸭子,最近开发中收集的这篇文章主要介绍(JavaScript)函数对象 - (name、length、自定义属性)、命名函数表达式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

函数对象

  • 属性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

最后

以上就是紧张小鸭子为你收集整理的(JavaScript)函数对象 - (name、length、自定义属性)、命名函数表达式的全部内容,希望文章能够帮你解决(JavaScript)函数对象 - (name、length、自定义属性)、命名函数表达式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部