浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序

yizhihongxing

浅谈JS函数三种定义方式

在JavaScript中,函数也是对象。定义函数的方法有三种:函数声明、函数表达式和Function构造函数。它们的语法如下:

函数声明

function fnDeclaration(arg1, arg2, ...) {
  // 函数体
}

函数声明是函数最基本的定义方式。它是在函数执行前就会被解析并创建,所以可以先调用函数再声明函数:

sayHello();

function sayHello() {
 console.log('Hello world!');
}

函数表达式

const fnExpression = function (arg1, arg2, ...) {
  // 函数体
};

函数表达式实际上是给一个匿名函数一个变量名,这样这个函数就可以像变量一样进行操作。函数表达式的好处是可以延迟函数的创建,只有在执行到该行代码时才会创建和赋值。函数表达式可以是命名函数表达式、自执行函数表达式或匿名函数表达式:

// 命名函数表达式
const fnNamedExpression = function sayHello(name) {
  console.log(`Hello ${name}`);
};

// 自执行函数表达式
const result = (function () {
  // ...
})();

// 匿名函数表达式
const fnAnonymousExpression = function () {
  console.log('Hello world!');
};

Function构造函数

const fnConstructor = new Function('arg1', 'arg2', 'return arg1 + arg2;');

Function构造函数接受一些参数(函数的参数和函数体)作为字符串,并返回一个新创建的函数。使用Function构造函数创建函数的缺点是不能访问当前作用域中的变量,因此不太常用。

const sum = new Function('a', 'b', 'return a + b');
console.log(sum(1, 2)); // 3

四种调用方式

在JavaScript中,函数调用有四种方式:函数调用、方法调用、构造函数调用和apply/call调用。

函数调用

直接调用一个函数,这种调用方式是最普通和最简单的调用方式:

function sayHello(name) {
  console.log(`Hello ${name}`);
}

sayHello('John'); // Hello John

方法调用

当一个函数是一个对象的属性时,我们就称它为这个对象的方法。方法调用是在一个对象上调用一个函数,此时函数中的this指向这个对象:

const person = {
  name: 'John',
  sayHello() {
    console.log(`Hello ${this.name}`);
  }
};

person.sayHello(); // Hello John

构造函数调用

构造函数创建一个类的实例。当使用new关键字调用一个函数时,它就成为了一个构造函数:

function Person(name) {
  this.name = name;
}

const john = new Person('John');
console.log(john.name); // John

apply/call调用

apply和call方法可以改变函数执行时的this指向,也可以将一个参数数组传递给函数。

function sayName() {
  console.log(`My name is ${this.name}`);
}

const person1 = {name: 'John'};
const person2 = {name: 'Jane'};

sayName.call(person1); // My name is John
sayName.apply(person2); // My name is Jane

调用顺序

当一个函数被调用时,它会根据其调用方式来确定this的值。下面是调用顺序的规则:

  1. 如果函数使用了new关键字,那么this指向新创建的对象。
  2. 如果函数是用apply、call或bind调用的,那么this指向被指定的对象。
  3. 如果函数是作为一个对象的方法调用的,那么this指向该对象。
  4. 如果函数没有使用上述方法中的任何一种调用方式,那么this指向全局对象(在浏览器中是window,在Node.js中是global)。

示例

函数声明和方法调用

function MyClass(name) {
  this.name = name;
}

MyClass.prototype.sayHello = function () {
  console.log(`Hello ${this.name}`);
}

const instance = new MyClass('John');
instance.sayHello(); // Hello John

apply调用

function sayName() {
  console.log(`My name is ${this.name}`);
}

const person = {name: 'John'};

sayName.apply(person); // My name is John

在上面的例子中,我们使用apply将person作为sayName函数的上下文(this指向)来调用sayName。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQuery时间插件jquery.clock.js用法实例(5个示例)

    当用户需要在网页中显示时间时,可以使用jQuery时间插件jquery.clock.js。 下面是关于该插件的完整攻略和5个示例。 1. 下载和引入jquery.clock.js 首先,需要从官方网站下载jquery.clock.js。然后在你的HTML页面中引入jquery和jquery.clock.js: <script src="jqu…

    JavaScript 2023年5月27日
    00
  • Javascript中call和apply函数的比较和使用实例

    介绍 在 JavaScript 中,我们可以使用 call 和 apply 函数来改变函数运行时的上下文环境(this指向)以及传递函数所需的参数。call 和 apply 的作用类似,不同之处在于传参方式的不同。 call 函数传入的参数可以是多个单独的参数,而 apply 函数传入的参数必须是一个数组。 语法 函数.call(执行上下文, arg1, a…

    JavaScript 2023年6月11日
    00
  • 加速IE的Javascript document输出的方法

    加速IE的Javascript document输出的方法主要是通过减少代码量、避免重复的DOM操作、使用innerHTML代替元素属性和使用文档片段来优化代码执行效率。 具体的实现步骤包括以下几个方面: 减少代码量 减少不必要的代码量是不言而喻的,代码越多,执行效率越低。在Javascript中,我们可以借助数组的join方法来将字符串拼接,而不是使用循环…

    JavaScript 2023年5月28日
    00
  • JavaScript正则表达式函数总结(常用)

    JavaScript正则表达式函数总结(常用) 正则表达式是用于处理字符串的强大工具,JavaScript内置了正则表达式对象RegExp,使用正则表达式可以快速而灵活地解析、匹配和替换字符串。 常用正则表达式函数 test() test()方法用于测试一个字符串是否匹配某个正则表达式,返回值为布尔类型,如果匹配成功,则返回true,否则返回false。 l…

    JavaScript 2023年5月27日
    00
  • JavaScript中子对象访问父对象的方式详解

    下面我来详细讲解“JavaScript中子对象访问父对象的方式详解”。 1. 使用this关键字 在JavaScript中,this关键字表示当前对象。使用this关键字可以访问当前对象的属性和方法,也可以通过this关键字访问当前对象的父对象。假设我们有一个如下的对象,其中包含子对象: let parentObj = { name: "父对象&q…

    JavaScript 2023年5月27日
    00
  • Bootstrap轮播加上css3动画,炫酷到底!

    下面是关于“Bootstrap轮播加上css3动画,炫酷到底!”的完整攻略。 1. 准备工作 首先,在使用Bootstrap轮播加上css3动画之前,你需要先做好一些准备工作,包括: 在你的HTML文件中引入Bootstrap的CSS和JavaScript文件。 创建轮播的HTML结构。 为轮播添加必要的样式。 如果你对以上准备工作有疑问,可以参考Boots…

    JavaScript 2023年6月10日
    00
  • 详解js中常规日期格式处理、月历渲染和倒计时函数

    下面将为您详细讲解js中常规日期格式处理、月历渲染和倒计时函数的完整攻略。 常规日期格式处理 在JavaScript中,我们可以使用Date对象对日期进行处理。常用的日期格式处理函数包括getFullYear()、getMonth()、getDate()、getDay()等。这些函数用于获取年、月、日、星期几等常用日期信息。比如,我们可以使用以下代码获取当前…

    JavaScript 2023年5月28日
    00
  • JavaScript驾驭网页-DOM

    JavaScript驾驭网页-DOM攻略 DOM(Document Object Model)是一种表述HTML、XML等文档的标准模型,由节点树构成,后续操作都基于节点树上的节点。 1. 获取元素 想要驾驭网页,首先需要获取要操作的元素。 1.1 通过id获取元素 let element = document.getElementById("el…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部