aspnet网站开发 视频gta5地产网站建设中
news/
2025/10/8 7:26:30/
文章来源:
aspnet网站开发 视频,gta5地产网站建设中,重庆微信网站开,网站编程论文定义函数
在JavaScript中#xff0c;定义函数的方式如下#xff1a;
function abs(x) {
if (x 0) {
return x;
} else {
return -x;
}
}
上述abs()函数的定义如下#xff1a;
function指出这是一个函数定义#xff1b;
abs是函数的名称#xff1b;
(x)括号内列出函数…定义函数
在JavaScript中定义函数的方式如下
function abs(x) {
if (x 0) {
return x;
} else {
return -x;
}
}
上述abs()函数的定义如下
function指出这是一个函数定义
abs是函数的名称
(x)括号内列出函数的参数多个参数以,分隔
{ ... }之间的代码是函数体可以包含若干语句甚至可以没有任何语句。
请注意函数体内部的语句在执行时一旦执行到return时函数就执行完毕并将结果返回。因此函数内部通过条件判断和循环可以实现非常复杂的逻辑。
如果没有return语句函数执行完毕后也会返回结果只是结果为undefined。
由于JavaScript的函数也是一个对象上述定义的abs()函数实际上是一个函数对象而函数名abs可以视为指向该函数的变量。
因此第二种定义函数的方式如下
var abs function (x) {
if (x 0) {
return x;
} else {
return -x;
}
};
在这种方式下function (x) { ... }是一个匿名函数它没有函数名。但是这个匿名函数赋值给了变量abs所以通过变量abs就可以调用该函数。
上述两种定义完全等价注意第二种方式按照完整语法需要在函数体末尾加一个;表示赋值语句结束。
调用函数
调用函数时按顺序传入参数即可
abs(10); // 返回10
abs(-9); // 返回9
由于JavaScript允许传入任意个参数而不影响调用因此传入的参数比定义的参数多也没有问题虽然函数内部并不需要这些参数
abs(10, blablabla); // 返回10
abs(-9, haha, hehe, null); // 返回9
传入的参数比定义的少也没有问题
abs(); // 返回NaN
此时abs(x)函数的参数x将收到undefined计算结果为NaN。
要避免收到undefined可以对参数进行检查
function abs(x) {
if (typeof x ! number) {
throw Not a number;
}
if (x 0) {
return x;
} else {
return -x;
}
}
arguments
JavaScript还有一个免费赠送的关键字arguments它只在函数内部起作用并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array
use strict
----
function foo(x) {
console.log(x x); // 10
for (var i0; i
console.log(arg i arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30);
利用arguments你可以获得调用者传入的所有参数。也就是说即使函数不定义任何参数还是可以拿到参数的值
function abs() {
if (arguments.length 0) {
return 0;
}
var x arguments[0];
return x 0 ? x : -x;
}
abs(); // 0
abs(10); // 10
abs(-9); // 9
实际上arguments最常用于判断传入参数的个数。你可能会看到这样的写法
// foo(a[, b], c)
// 接收2~3个参数b是可选参数如果只传2个参数b默认为null
function foo(a, b, c) {
if (arguments.length 2) {
// 实际拿到的参数是a和bc为undefined
c b; // 把b赋给c
b null; // b变为默认值
}
// ...
}
要把中间的参数b变为“可选”参数就只能通过arguments判断然后重新调整参数并赋值。
rest参数
由于JavaScript函数允许接收任意个参数于是我们就不得不用arguments来获取所有参数
function foo(a, b) {
var i, rest [];
if (arguments.length 2) {
for (i 2; i
rest.push(arguments[i]);
}
}
console.log(a a);
console.log(b b);
console.log(rest);
}
为了获取除了已定义参数a、b之外的参数我们不得不用arguments并且循环要从索引2开始以便排除前两个参数这种写法很别扭只是为了获得额外的rest参数有没有更好的方法
ES6标准引入了rest参数上面的函数可以改写为
function foo(a, b, ...rest) {
console.log(a a);
console.log(b b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 结果:
// a 1
// b 2
// Array [ 3, 4, 5 ]
foo(1);
// 结果:
// a 1
// b undefined
// Array []
rest参数只能写在最后前面用...标识从运行结果可知传入的参数先绑定a、b多余的参数以数组形式交给变量rest所以不再需要arguments我们就获取了全部参数。
如果传入的参数连正常定义的参数都没填满也不要紧rest参数会接收一个空数组注意不是undefined。
因为rest参数是ES6新标准所以你需要测试一下浏览器是否支持。请用rest参数编写一个sum()函数接收任意个参数并返回它们的和
use strict;
----
function sum(...rest) {
???
}
----
// 测试:
var i, args [];
for (i1; i100; i) {
args.push(i);
}
if (sum() ! 0) {
console.log(测试失败: sum() sum());
} else if (sum(1) ! 1) {
console.log(测试失败: sum(1) sum(1));
} else if (sum(2, 3) ! 5) {
console.log(测试失败: sum(2, 3) sum(2, 3));
} else if (sum.apply(null, args) ! 5050) {
console.log(测试失败: sum(1, 2, 3, ..., 100) sum.apply(null, args));
} else {
console.log(测试通过!);
}
小心你的return语句
前面我们讲到了JavaScript引擎有一个在行末自动添加分号的机制这可能让你栽到return语句的一个大坑
function foo() {
return { name: foo };
}
foo(); // { name: foo }
如果把return语句拆成两行
function foo() {
return
{ name: foo };
}
foo(); // undefined
要小心了由于JavaScript引擎在行末自动添加分号的机制上面的代码实际上变成了
function foo() {
return; // 自动添加了分号相当于return undefined;
{ name: foo }; // 这行语句已经没法执行到了
}
所以正确的多行写法是
function foo() {
return { // 这里不会自动加分号因为{表示语句尚未结束
name: foo
};
}
练习
定义一个计算圆面积的函数area_of_circle()它有两个参数
r: 表示圆的半径
pi: 表示π的值如果不传则默认3.14
use strict;
function area_of_circle(r, pi) {
----
return 0;
----
}
// 测试:
if (area_of_circle(2) 12.56 area_of_circle(2, 3.1416) 12.5664) {
console.log(测试通过);
} else {
console.log(测试失败);
}
小明是一个JavaScript新手他写了一个max()函数返回两个数中较大的那个
use strict;
function max(a, b) {
----
if (a b) {
return
a;
} else {
return
b;
}
----
}
console.log(max(15, 20));
但是小明抱怨他的浏览器出问题了无论传入什么数max()函数总是返回undefined。请帮他指出问题并修复。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931203.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!