上一节我们深入学习了JS函数参数的arguments对象,本节我们将深入学习调用JS函数的4种方式:
1. 最简单的方式,作为一个函数被调用:
/*作为一个函数被调用*/
function f()
{
console.log('Hello JS!');
}
f();//输出“Hello JS!”2.方法调用:将函数作为对象的方法进行调用。
const obj = {
brand:"Dotcpp编程",
address:"dotcpp.com",
f(){
console.log(`${this.brand}:${this.address}`);
}
}
obj.f();//打印“Dotcpp编程:dotcpp.com”3.构造函数调用:使用new关键字创建对象实例时,会自动调用构造函数。
/*作为构造器调用*/
function dotcpp_user(name,age,grade)
{
this.name=name;
this.age=age;
this.grade=grade;
}
const user01=new dotcpp_user('user01',18,100)
const user02=new dotcpp_user('user02',18,100)
const user03=new dotcpp_user('user03',18,100)
console.log(user01);//dotcpp_user {name: 'user01', age: 18, grade: 100}
console.log(user02);//dotcpp_user {name: 'user02', age: 18, grade: 100}
console.log(user03);//dotcpp_user {name: 'user03', age: 18, grade: 100}4.间接调用:使用call()或apply()方法来间接调用函数,并指定函数内部的this值。
/*通过apply、call来更改this指向,进行speak函数的不同输出*/
const JS = { course: "JS" };
const CPP = { course: "C++" };
const Java = { course: "Java" };
function speak() {
console.log(this.course);
}
speak.call(JS); // 输出: JS
speak.apply(CPP); // 输出: C++
speak.call(Java); // 输出: Java在JS函数调用过程中,还有一些特殊的情况需要注意:
1.如果没有明确指定this值,严格模式下函数内部的this将为undefined,非严格模式下this将指向全局对象(浏览器环境下为window)。
2.函数可以接收参数,在调用时传递给函数。
3.函数可以返回值,调用时可以接收函数的返回值。
JS中函数调用时需要注意一些常见的问题,下面我们通过表格展示:
| 情景 | 描述 |
|---|---|
| 函数名的拼写 | 确保函数名的拼写是正确的,否则会导致函数未定义或找不到的错误 |
| 函数参数的传递 | 根据函数定义的参数列表,确保正确传递参数。参数的数量、类型和顺序都应与函数定义相匹配,否则可能导致函数执行错误或产生意外结果 |
| 上下文对象(this)的指向 | 对于函数调用中涉及上下文对象(如方法调用、间接调用),需要确保函数内部的this指向正确。可以使用call()、apply()或箭头函数来显式指定this的值,或者通过绑定函数来固定函数的上下文 |
| 异步函数的处理 | 如果要调用异步函数(例如带有回调函数或返回Promise的函数),需要适当处理异步操作的结果,例如使用.then()或async/await等方式来处理返回值或错误 |
| 函数返回值的处理 | 函数可能会返回一个值,需要根据需要接收并处理该返回值。可以将返回值赋给变量,或直接在调用语句中使用返回值 |
| 函数作为参数传递 | JavaScript中函数可以作为参数传递给其他函数,这被称为"高阶函数"。在调用接收函数参数的函数时,需要确保传递正确的函数引用,并根据需要传递其他参数 |
| 函数的执行时机 | 函数调用并不总是即刻执行,有些函数可能在事件触发、异步操作或定时器等条件满足后才会被调用。因此,需要注意函数的执行时机,以确保在正确的时间调用函数 |
总结:本节我们详细介绍了如何调用JS中的函数,同时分析了JS函数调用的常见错误,希望读者养成合法调用函数的习惯。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程