End

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

posted @   白乾涛  阅读(1802)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示