我是靠谱客的博主 紧张小鸭子,最近开发中收集的这篇文章主要介绍(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、自定义属性)、命名函数表达式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复