49、JavaScript 函数定义
- JavaScript 函数是通过 function 关键词定义的。
- 您可以使用函数声明或函数表达式。
49.1 函数声明
- 语法:
function functionName(parameters) {
要执行的代码
}
示例:
<body>
<p id="demo"></p>
<script>
var x = myFunction(3, 6);
document.getElementById("demo").innerHTML = x;
function myFunction(a, b) {
return a * b;
}
</script>
</body>
输出:18
49.2 函数表达式
-
JavaScript 函数也可以使用表达式来定义。
-
函数表达式可以在变量中存储:
<body>
<p id="demo"></p>
<script>
var x = function (a, b) {
return a * b;
};
document.getElementById("demo").innerHTML = x;
</script>
</body>
输出:function (a, b) { return a * b; }
- 在变量中保存函数表达式之后,此变量可用作函数:
<body>
<p id="demo"></p>
<script>
var x = function (a, b) {
return a * b;
};
document.getElementById("demo").innerHTML = x(3, 4);
</script>
</body>
输出:12
49.3 Function() 构造器
-
正如您在之前的例子中看到的,JavaScript 函数是通过 function 关键词定义的。
-
函数也可以通过名为 Function() 的内建 JavaScript 函数构造器来定义。
<body>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = myFunction(3, 6);
function myFunction(a, b) {
return a * b;
}
</script>
</body>
输出:18
或者:
<body>
<p id="demo"></p>
<script>
var myFunction = function (a, b) {
return a * b;
};
document.getElementById("demo").innerHTML = myFunction(3, 6);
</script>
</body>
输出:18
49.4 自调用函数
-
函数表达式可以作为“
自调用
”。 -
自调用表达式是自动被调用(开始)的,在不进行调用的情况下。
-
函数表达式会自动执行,假如表达式后面跟着
()
。 -
您无法对函数声明进行自调用。您需要在函数周围添加括号,以指示它是一个函数表达式:
<body>
<p id="demo"></p>
<script>
(function () {
document.getElementById("demo").innerHTML = "自调用内容";
})();
</script>
</body>
输出:自调用内容
49.5 函数可用作值
- JavaScript 函数可被用作值:
<body>
<p id="demo"></p>
<script>
var myFunction = function (a, b) {
return a * b;
};
document.getElementById("demo").innerHTML = myFunction(3, 6);
</script>
</body>
输出:18
- JavaScript 函数可用在表达式中:
<body>
<p id="demo"></p>
<script>
function myFunction(a, b) {
return a * b;
}
var x = myFunction(3, 4) * 5;
document.getElementById("demo").innerHTML = x;
</script>
</body>
输出:60
49.6 函数是对象
-
JavaScript 中的 typeof 运算符会为函数返回 “function”。但是最好是把 JavaScript 函数描述为对象。
-
JavaScript 函数都有属性和方法。
-
arguments.length 会返回函数被调用时收到的参数数目:
<body>
<p id="demo"></p>
<script>
function myFunction(a, b) {
return arguments.length;
}
var x = myFunction(3, 4);
document.getElementById("demo").innerHTML = x;
</script>
</body>
输出:2
- toString() 方法以字符串返回函数:
<body>
<p id="demo"></p>
<script>
function myFunction(a, b) {
return a * b;
}
document.getElementById("demo").innerHTML = myFunction.toString();
</script>
</body>
输出:function myFunction(a, b) { return a * b; }
-
定义为对象属性的函数,被称为对象的方法。
-
为创建新对象而设计的函数,被称为对象构造函数(对象构造器)。
49.7 箭头函数
-
箭头函数允许使用简短的语法来编写函数表达式。
-
您不需要 function 关键字、return 关键字和花括号。
<body>
<p id="demo"></p>
<script>
// function myFunction(a, b) {
// return a * b;
// }
//可简化为:
// var x = (a, b) => a * b;
//或者
var x = (a, b) => {
return a * b;
};
document.getElementById("demo").innerHTML = x(5, 6);
</script>
</body>
输出:30
50、 JavaScript 函数参数
- JavaScript 函数
不会对参数值进行任何检查
。
50.1 函数参数
-
函数参数(parameter)指的是在函数定义中列出的名称。
-
函数参数(argument)指的是传递到函数或由函数接收到的真实值。
functionName(parameter1, parameter2, parameter3) {
要执行的代码
}
50.2 参数规则
-
JavaScript 函数定义不会为参数(parameter)规定数据类型。
-
JavaScript 函数不会对所传递的参数(argument)实行类型检查。
-
JavaScript 函数不会检查所接收参数(argument)的数量。
50.3 参数默认
- 如果调用参数时省略了参数(少于被声明的数量),则丢失的值被设置为:
undefined
。
<body>
<p id="demo"></p>
<script>
function myFunction(a, b) {
if (b === undefined) {
b = 0;
}
return a * b;
}
document.getElementById("demo").innerHTML = myFunction(5);
</script>
</body>
输出:0
- 如果函数调用的参数太多(超过声明),则可以使用
arguments
对象来达到这些参数。(如下)
50.4 arguments 对象
-
JavaScript 函数有一个名为
arguments
对象的内置对象。 -
arguments
对象包含函数调用时使用的参数数组。
示例:使用函数来查找(例如)数字列表中的最高值:
<body>
<p id="demo"></p>
<script>
function findMax() {
var i;
var max = -Infinity;
for (i = 0; i < arguments.length; i++) {
if (max < arguments[i]) {
max = arguments[i];
}
}
return max;
}
document.getElementById("demo").innerHTML = findMax(4, 5, 6);
</script>
</body>
输出:6
示例:创建一个函数来总和所有输入值:
<body>
<p id="demo"></p>
<script>
function findMax() {
var i;
var sum = 0;
for (i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
document.getElementById("demo").innerHTML = findMax(4, 5, 6);
</script>
</body>
输出:15
51、JavaScript 函数调用
- JavaScript 函数内部的代码会在“某物”调用它时执行。
51.1 以函数形式调用函数
<body>
<p id="demo"></p>
<script>
function myFunction(a, b) {
return a * b;
}
document.getElementById("demo").innerHTML = myFunction(10, 2);
</script>
</body>
或者:
<body>
<p id="demo"></p>
<script>
function myFunction(a, b) {
return a * b;
}
document.getElementById("demo").innerHTML = window.myFunction(10, 2);
</script>
</body>
输出:20
51.2 this 关键词
- 全局对象:
<body>
<p id="demo"></p>
<script>
function myFunction() {
return this;
}
document.getElementById("demo").innerHTML = myFunction();
</script>
</body>
输出:
[object Window]
- 作为方法来调用函数:
<body>
<p id="demo"></p>
<script>
var myObject = {
firstName: "文",
lastName: "阿花",
fullName: function () {
return this.firstName + this.lastName;
},
};
document.getElementById("demo").innerHTML = myObject.fullName();
</script>
</body>
输出:文阿花
或者:
<body>
<p id="demo"></p>
<script>
var myObject = {
firstName: "文",
lastName: "阿花",
fullName: function () {
return this;
},
};
document.getElementById("demo").innerHTML = myObject.fullName();
</script>
</body>
输出:[object Object]
52、JavaScript 函数 Call
52.1 方法重用
- 使用
call()
方法,您可以编写能够在不同对象上使用的方法。
52.2 函数是对象方法
-
在 JavaScript 中,函数是对象的方法。
-
如果一个函数不是 JavaScript 对象的方法,那么它就是全局对象的函数。
示例:下面的例子创建了带有三个属性的对象(firstName、lastName、fullName):
fullName 属性是一个方法。person 对象是该方法的拥有者。
fullName 属性属于 person 对象的方法。
<body>
<p id="demo"></p>
<script>
var myObject = {
firstName: "文",
lastName: "阿花",
fullName: function () {
return this.firstName + this.lastName;
},
};
document.getElementById("demo").innerHTML = myObject.fullName();
</script>
</body>
输出:文阿花
52.3 JavaScript call() 方法
-
call()
方法是预定义的 JavaScript 方法。 -
它可以用来调用所有者对象作为参数的方法。
-
通过
call()
,您能够使用属于另一个对象的方法。
示例:本例调用 person 的 fullName 方法,并用于 person1:
<body>
<p id="demo"></p>
<p id="demo1"></p>
<script>
var person = {
fullName: function () {
return this.firstName + this.lastName;
},
};
var person1 = {
firstName: "文",
lastName: "阿花",
};
var person2 = {
firstName: "肖",
lastName: "战",
};
document.getElementById("demo").innerHTML = person.fullName.call(person1);
document.getElementById("demo1").innerHTML =
person.fullName.call(person2);
</script>
</body>
输出:文阿花
肖战
52.4 带参数的 call() 方法
call() 方法可接受参数:
<body>
<p id="demo"></p>
<script>
var person = {
fullName: function (city, country) {
return this.firstName + this.lastName + " " + city + " " + country;
},
};
var person1 = {
firstName: "文",
lastName: "阿花",
};
var person2 = {
firstName: "肖",
lastName: "战",
};
document.getElementById("demo").innerHTML = person.fullName.call(
person1,
"郑州",
"中国"
);
</script>
</body>
输出:文阿花 郑州 中国
53、JavaScript 函数 Apply
53.1 方法重用
- 通过
apply()
方法,您能够编写用于不同对象的方法。
53.2 JavaScript apply() 方法
- apply() 方法与 call() 方法非常相似:
示例:在本例中,person 的 fullName 方法被应用到 person1:
<body>
<p id="demo"></p>
<script>
var person = {
fullName: function () {
return this.firstName + this.lastName;
},
};
var person1 = {
firstName: "文",
lastName: "阿花",
};
var person2 = {
firstName: "肖",
lastName: "战",
};
document.getElementById("demo").innerHTML =
person.fullName.apply(person1);
</script>
</body>
输出:文阿花
53.3 call() 和 apply() 之间的区别
不同之处是:
-
call()
方法分别接受参数。 -
apply()
方法接受数组形式的参数
。 -
如果要使用数组而不是参数列表,则
apply()
方法非常方便。
53.4 带参数的 apply() 方法
apply()
方法接受数组中的参数。
<body>
<p id="demo"></p>
<script>
var person = {
fullName: function (city, country) {
return this.firstName + this.lastName + " " + city + " " + country;
},
};
var person1 = {
firstName: "文",
lastName: "阿花",
};
var person2 = {
firstName: "肖",
lastName: "战",
};
document.getElementById("demo").innerHTML = person.fullName.apply(
person1,
["郑州", "中国"]
);
</script>
</body>
输出:文阿花 郑州 中国
53.5 在数组上模拟 max 方法
您可以使用 Math.max() 方法找到(数字列表中的)最大数字:
document.getElementById("demo").innerHTML = Math.max(1,2,3);
或者:
Math.max.apply(null, [1,2,3]); // 也会返回 3
第一个参数(null)无关紧要。在本例中未使用它。
或者:
document.getElementById("demo").innerHTML = Math.max.apply(Math, [1,2,3]);
或者:
Math.max.apply(" ", [1,2,3]); // 也会返回 3
或者:
Math.max.apply(0, [1,2,3]); // 也会返回 3
输出:3
54、函数借用:JavaScript Function bind()
函数借用(Function Borrowing
)
- 通过使用
bind()
方法,一个对象可以从另一个对象借用一个方法。
示例:下面的例子创建了 2 个对象(person 和 member),member 对象借用了 person 对象的 fullname 方法:
<body>
<p id="demo"></p>
<script>
var person = {
firstName: "钟",
lastName: "离",
fullName: function () {
return this.firstName + this.lastName;
},
};
var person1 = {
firstName: "文",
lastName: "阿花",
};
var person2 = {
firstName: "肖",
lastName: "战",
};
var fullName = person.fullName.bind(person1);
document.getElementById("demo").innerHTML = fullName();
</script>
</body>
输出:文阿花
更多内容:JavaScript Function bind()