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

浅谈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日

相关文章

  • Javascript生成json的函数代码(可以用php的json_decode解码)

    生成 JSON 格式的数据通过 JavaScript 来实现,通常使用 JSON.stringify() 方法。该方法接受一个 JavaScript 对象或数组作为参数,返回 JSON 字符串。 下面是生成 JSON 格式数据的示例代码: const data = { name: "your name", age: 18, gender:…

    JavaScript 2023年5月19日
    00
  • js正则表达式验证表单【完整版】

    我来为您详细讲解“js正则表达式验证表单【完整版】”的完整攻略。 1. 概述 在网页表单的开发中,我们经常需要对用户输入的内容进行验证,这样才能确保数据的正确性和合法性。而对于一般的验证需求,正则表达式无疑是最为方便、高效的解决方案之一。所以,本篇文章将会介绍如何使用 JavaScript 正则表达式来验证表单,以及常见的表单验证规则。 2. 表单验证规则 …

    JavaScript 2023年6月10日
    00
  • 详解JavaScript正则表达式之RegExp对象

    详解JavaScript正则表达式之RegExp对象 什么是正则表达式? 正则表达式是一种字符串匹配的模式。在JavaScript中,我们可以使用RegExp对象来创建和使用正则表达式。 创建RegExp对象 在JavaScript中,我们有两种方式来创建一个RegExp对象: 使用字面量方式 let regExp = /pattern/flags; 其中,…

    JavaScript 2023年6月10日
    00
  • python爬虫selenium和phantomJs使用方法解析

    Python爬虫使用Selenium和PhantomJS解析 前言 爬虫是信息搜集和数据挖掘的重要手段,而python作为目前应用范围最广的编程语言,也拥有非常丰富的爬虫套件。其中,Selenium和PhantomJS是两个非常重要的工具,本篇文章将详细介绍它们的使用方法。 Selenium简介 Selenium是一款用于Web应用程序测试的工具,它模拟了用…

    JavaScript 2023年6月11日
    00
  • 使用onbeforeunload属性后的副作用

    使用onbeforeunload属性后的副作用可能会影响到用户的体验,因为当用户尝试关闭页面或者离开页面时,浏览器会弹出一个对话框,询问用户是否确定要离开当前页面。 在使用onbeforeunload属性时,有两个潜在的副作用: 对于复杂的单页应用,当用户尝试离开页面时,可能会触发onbeforeunload事件。即使用户仅仅是在应用中导航到不同的页面或者进…

    JavaScript 2023年6月11日
    00
  • JavaScript获取当前网页最后修改时间的方法

    获取当前网页最后修改时间是一个常见的需求,可以通过JavaScript来实现。下面是一个完整的攻略,包括两条示例说明。 方法一:通过document.lastModified属性获取 每个HTML文档都有一个默认的document对象。document.lastModified属性可以返回当前网页最后修改时间,返回的是一个字符串类型的时间戳。 let las…

    JavaScript 2023年5月27日
    00
  • js 返回时间戳所对应的具体时间

    为了返回时间戳所对应的具体时间,我们可以使用Date()对象及其方法来实现。 下面介绍具体步骤: 1. 获取时间戳 首先需要获取时间戳,时间戳是1970年1月1日 00:00:00 UTC到指定时间的毫秒数。可以通过以下代码获取当前时间戳: const timestamp = new Date().getTime(); 2. 转换时间戳为日期时间格式 使用D…

    JavaScript 2023年5月27日
    00
  • JavaScript字符串对象slice方法入门实例(用于字符串截取)

    JavaScript字符串对象slice方法入门实例 在JavaScript中,字符串对象是非常常用的数据类型,其内置的方法也非常丰富。其中一个方法就是slice()方法,这个方法可以用于截取字符串,下面就来详细讲解如何使用slice方法。 什么是slice方法? 我们先来看看slice方法的定义: String.slice(beginIndex[, end…

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