哪些网站做的人比较少,wordpress文章excerpt字数,高端网站设计工作室,东莞企业网络营销平台定义函数
一个函数定义#xff08;也称为函数声明#xff0c;或函数语句#xff09;由 function 关键字#xff0c;并跟随以下部分组成#xff1a;
函数名称。函数参数列表#xff0c;包围在括号中并由逗号分隔。定义函数的 JavaScript 语句#xff0c;用大括号括起来…定义函数
一个函数定义也称为函数声明或函数语句由 function 关键字并跟随以下部分组成
函数名称。函数参数列表包围在括号中并由逗号分隔。定义函数的 JavaScript 语句用大括号括起来{ /* … */ }。
例如以下的代码定义了一个简单的名为 square 的函数
function square(number) {return number * number;
}如果你将对象作为参数传递而函数改变了这个对象的属性这样的改变对函数外部是可见的如下面的例子所示
function myFunc(theObject) {theObject.make Toyota;
}const mycar {make: Honda,model: Accord,year: 1998,
};console.log(mycar.make); // Honda
myFunc(mycar);
console.log(mycar.make); // Toyota如果你将数组作为参数传递而函数改变了这个数组的值这样的改变对函数外部也同样可见如下面的例子所示
function myFunc(theArr) {theArr[0] 30;
}const arr [45];console.log(arr[0]); // 45
myFunc(arr);
console.log(arr[0]); // 30函数表达式
虽然上面的函数声明在语法上是一个语句但函数也可以由 函数表达式 创建。
这样的函数可以是匿名的它不必有一个名称。例如函数 square 也可这样来定义 const square function (number) {return number * number;
};console.log(square(4)); // 16调用函数
定义的函数并不会自动执行它。定义了函数仅仅是赋予函数以名称并明确函数被调用时该做些什么。调用函数才会以给定的参数真正执行这些动作。例如一旦你定义了函数 square你可以像这样调用它 square(5);函数提升
考虑以下示例
console.log(square(5)); // 25function square(n) {return n * n;
}尽管 square() 函数在声明之前被调用但此代码的运行并没有任何错误。这是因为 JavaScript 解释器会将整个函数声明提升到当前作用域的顶部因此上面的代码等价于
// 所有函数声明实际上都位于作用域的顶部
function square(n) {return n * n;
}console.log(square(5)); // 25函数提升仅适用于函数声明而不适用于函数表达式。以下代码无法运行
console.log(square(5)); // ReferenceError: Cannot access square before initialization
const square function (n) {return n * n;
};函数作用域
在函数内定义的变量不能在函数之外的任何地方访问因为变量仅仅在该函数的作用域内定义。相对应的一个函数可以访问定义在其范围内的任何变量和函数。
换言之定义在全局域中的函数可以访问所有定义在全局域中的变量。在另一个函数中定义的函数也可以访问在其父函数中定义的所有变量和父函数有权访问的任何其他变量。
// 下面的变量定义在全局作用域中
const num1 20;
const num2 3;
const name Chamakh;// 此函数定义在全局作用域中
function multiply() {return num1 * num2;
}console.log(multiply()); // 60// 嵌套函数示例
function getScore() {const num1 2;const num2 3;function add() {return ${name} 的得分为 ${num1 num2};}return add();
}console.log(getScore()); // Chamakh 的得分为 5嵌套函数和闭包
你可以在一个函数里面嵌套另外一个函数。嵌套内部函数对其容器外部函数是私有的。
它自身也形成了一个闭包closure。闭包是可以拥有独立变量以及绑定了这些变量的环境“封闭”了表达式的表达式通常是函数。
既然嵌套函数是一个闭包就意味着一个嵌套函数可以“继承”容器函数的参数和变量。换句话说内部函数包含外部函数的作用域。
可以总结如下
内部函数只可以在外部函数中访问。内部函数形成了一个闭包它可以访问外部函数的参数和变量但是外部函数却不能使用它的参数和变量。
下面的例子展示了嵌套函数
function addSquares(a, b) {function square(x) {return x * x;}return square(a) square(b);
}console.log(addSquares(2, 3)); // 13
console.log(addSquares(3, 4)); // 25
console.log(addSquares(4, 5)); // 41使用arguments对象
函数的实际参数会被保存在一个类似数组的 arguments 对象中。在函数内你可以按如下方式找出传入的参数
arguments[i];其中 i 是参数的序号从 0 开始。所以第一个传入函数的参数会是 arguments[0]。参数的数量由 arguments.length 表示。
使用 arguments 对象你可以处理比声明更多的参数来调用函数。这在你事先不知道会需要将多少参数传递给函数时十分有用。你可以用 arguments.length 来获得实际传递给函数的参数的数量然后用 arguments 对象来访问每个参数。
例如考虑有一个用来连接字符串的函数。唯一正式的参数是在连接后的字符串中用来分隔各个连接部分的字符。该函数定义如下
function myConcat(separator) {let result ; // 初始化列表// 迭代 argumentsfor (let i 1; i arguments.length; i) {result arguments[i] separator;}return result;
}解释一下
在 myConcat 函数中参数 separator 在函数定义时被声明这意味着它是函数的第一个形参。当函数被调用时实参会按照顺序与形参一一对应。第一个传递给函数 myConcat 的实参会被赋给函数内部定义的 separator 形参。
具体来说在调用 myConcat 函数时第一个传入的实参会被赋值给 separator 形参而之后传递的实参会被按照顺序依次存储在 arguments 对象中的索引为 1、2、3......的位置。因此实际上 arguments[1] 才是第二个传递给函数的实参。
通过显式声明 separator 作为第一个形参实现了将 arguments[0]调用函数时传递的第一个实参赋值给 separator 的效果。这样函数就能够按照传递的分隔符来拼接后续的参数字符串从而实现字符串拼接功能。
你可以给这个函数传递任意数量的参数它会将各个参数连接成一个字符串“列表”
console.log(myConcat(、, 红, 橙, 蓝));
// 红、橙、蓝、console.log(myConcat(, 大象, 长颈鹿, 狮子, 猎豹));
// 大象长颈鹿狮子猎豹console.log(myConcat(。, 智者, 罗勒, 牛至, 胡椒, 香菜));
// 智者。罗勒。牛至。胡椒。香菜。备注 arguments 变量只是“类数组”而不是数组。它与数组类似有索引编号和 length 属性。尽管如此它并不具备 Array 对象的所有数组操作方法。 函数参数
有两种特殊的参数语法默认参数和剩余参数。
默认参数
在 JavaScript 中函数参数的默认值是 undefined。然而在某些情况下设置不同的默认值可能会很有用。这正是默认参数的作用。
在过去用于设定默认参数的一般策略是在函数的主体中测试参数值是否为 undefined如果是则赋予这个参数一个默认值。
在下面的示例中如果调用函数时没有给 b 提供值那么它的值就是 undefined在执行 a*b 时调用乘法通常会返回 NaN。但是这已经被示例的第二行所避免了
function multiply(a, b) {b typeof b ! undefined ? b : 1;return a * b;
}console.log(multiply(5)); // 5使用默认参数在函数体的手动检查就不再必要了。现在你可以在函数头简单地把 1 设定为 b 的默认值
function multiply(a, b 1) {return a * b;
}console.log(multiply(5)); // 5剩余参数
剩余参数语法允许将不确定数量的参数表示为数组。
在下面的示例中multiply 函数使用剩余参数收集从第二个参数开始到最后的参数。然后该函数将它们与第一个参数相乘。
function multiply(multiplier, ...theArgs) {return theArgs.map((x) multiplier * x);
}const arr multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]箭头函数
箭头函数表达式也称胖箭头以区分未来 JavaScript 中假设的 - 语法相比函数表达式具有较短的语法且没有它自己的 this、arguments、super 和 new.targel。箭头函数总是匿名的。
在一些函数模式中更简洁的函数很受欢迎。对比一下
const a [Hydrogen, Helium, Lithium, Beryllium];const a2 a.map(function (s) {return s.length;
});console.log(a2); // [8, 6, 7, 9]const a3 a.map((s) s.length);console.log(a3); // [8, 6, 7, 9]预定义函数
JavaScript 语言有几个顶级的内置函数
eval()eval() 方法执行方法计算以字符串表示的 JavaScript 代码。
isNaN()isNaN() 函数判断一个值是否是 NaN。注意isNaN 函数内部的强制转换规则十分有趣。你也可以使用 Number.isNaN() 来判断该值是否为 NaN。
parseFloat()parseFloat() 函数解析字符串参数并返回一个浮点数其实就是将字符串转换为浮点数。
parseInt() parseInt() 函数解析字符串参数并返回指定的基数基础数学中的数制的整数其实就是将字符串转换为整数但是可以规定转换为几进制的整数。 附以上内容均为个人在MDN网站上学习JS的笔记若有侵权将在第一时间删除若有错误将在第一时间修改。