JavaScript 函数 闭包 arguments
JavaScript 函数 闭包 arguments
- 函数可以在声明之前调用
- 函数也是对象,其属性
arguments
返回函数调用过程接收到的参数数组,toString()
方法返回函数定义
函数声明
function f0(a, b) { return a * b }
var f1 = f0;
var f2 = function (a, b) { return a * b } // 相当于前面两步的合并写法,可以精简为
var f3 = new Function("a", "b", "return a * b"); // 要避免使用 new 关键字
const f4 = (a, b) => a * b // 箭头函数,箭头函数绑定的是外层 this 的值
var x = function (a, b) { return a * b }(2, 3); // 如果函数表达式后面紧跟 (),则会自动调用
console.log(`${f1(2, 3)} - ${f2(2, 3)} - ${f3(2, 3)} - ${x}`)
function test(a, b) {
console.log(test.toString()) // 返回函数的定义
console.log(arguments) // 返回函数的参数数组
return a * b
}
函数参数
- JavaScript 函数定义显式参数时没有指定数据类型
- JavaScript 函数对隐式参数的类型和个数没有进行检测
- 若在调用时未提供隐式参数,参数会默认设置为 undefined
function myFunction(x = 0, y) { // 为参数 x 设置一个默认值
if (y === undefined) y = 0; // 为参数 y 设置一个默认值
y = y || 0; // 如果 y 已经定义,返回 y,否则返回 0
}
arguments
JavaScript 函数有个内置的 arguments 对象,其包含了函数调用的参数数组。
函数调用时可以传递超出声明数量的参数,超出的参数虽然无法被直接引用,但可以使用 arguments 对象来调用。
function sumAll() {
var i, sum = 0;
for (i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
console.log(sumAll(3, 4, 5, 6))
传递参数
- 修改函数参数的值,不会修改在函数外定义的显式参数的初始值
- 修改函数参数的属性,可作用于函数外定义的显式参数的属性
var person = { name: "bqt" }
function test(a) {
a = { name: "abc" }
console.log(`inner: ${a.name}`) // abc
}
test(person)
console.log(`outer: ${person.name}`) // bqt,不会修改在函数外定义的显式参数的初始值
var person = { name: "bqt" }
function test(a) {
a.name = "abc"
console.log(`inner: ${a.name}`) // abc
}
test(person)
console.log(`outer: ${person.name}`) // abc,修改函数参数的属性,可作用于函数外定义的显式参数的属性
闭包
JavaScript 支持嵌套函数,嵌套函数可以访问上一层的函数变量。
闭包是一种保护私有变量的机制,它在函数执行时创建一个私有作用域,从而保护内部的私有变量不受外界干扰。
直观地说,闭包就像是一个不会被销毁的栈环境。
var add = (function () {
var counter = 0;
return () => counter += 1
})();
console.log(add.toString()); // () => counter += 1
console.log(add()); // 1
console.log(add()); // 2
console.log(add()); // 3
- 自我调用函数只执行一次:设置计数器为 0,并返回函数表达式
- add 变量是一个函数,并且它可以访问上一层作用域的计数器
- 计数器受匿名函数的作用域保护,只能通过 add 方法修改
闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。
或者说闭包就是子函数可以使用父函数的局部变量,以及父函数的参数。
2017-08-27
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/7442114.html
分类:
01 新版 MarkDown
标签:
2017
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?