JS深入浅出Function与构造函数

JS深入浅出Function与构造函数

什么是Function?

在JavaScript中,函数被看作是对象,函数也可以看作是特殊的对象。每个函数都是Function类型的实例,都有自己的属性和方法。Function类型的构造函数是用来创建函数对象的。

函数的作用是封装一段代码,并可以用来重复使用,降低代码复杂性,方便维护。一个函数可以有0个或多个参数,可以有0条或多条语句,函数可以返回值,也可以不返回值。

函数的声明与函数表达式

函数有两种声明方式:函数声明和函数表达式。

函数声明:

function add(num1, num2) {
    return num1 + num2;
}

函数表达式:

var add = function(num1, num2) {
    return num1 + num2;
};

在函数声明中,函数名add是必须的,而在函数表达式中,函数名add是可选的。

函数的调用

函数调用通常通过函数名后跟一对括号实现:

add(1, 2);

还可以通过apply()方法实现,apply()方法支持传递数组参数:

add.apply(null, [1, 2]);

函数的参数

函数参数的数量是不确定的,可以定义0个或多个参数。函数的参数可以看作是一个数组:

function sayHi() {
    for (var i = 0, len = arguments.length; i < len; i++) {
        console.log('Hi,' + arguments[i]);
    }
}

arguments是一个伪数组(Array-like object),其中保存着传入函数的所有参数。函数内部可以通过arguments对象来遍历参数。

函数也可以定义默认参数:

function greet(name, msg) {
    name = name || 'World';
    msg = msg || 'Hello';
    console.log(msg + ' ' + name);
}

当使用如下调用方式时,参数值undefined会被替换为默认值:

greet(); // "Hello World"
greet('Mike', 'Hi'); // "Hi Mike"
greet('Mike'); // "Hello Mike"

函数的返回值

函数可以返回一个值,也可以不返回值。有时候,函数返回的是一个对象或数组。

function getPerson() {
    return {
        name: 'Mike',
        age: 29
    };
}

在返回值的对象中,可以包含任意数量的属性。

函数的作用域

JavaScript中的函数作用域与其他编程语言中的作用域有所不同。在JavaScript中,函数在被调用时会创建一个新的作用域(函数内部作用域),其作用域链包含了外部作用域(函数被定义时所在的作用域)的变量与函数。

var name = 'Mike';

function greet() {
    var msg = 'Hello';
    console.log(msg + ' ' + name);
}

greet(); // "Hello Mike"

在函数内部,可以访问外部作用域的变量name

函数的属性和方法

函数也是对象,所以函数也有属性和方法。其中,最常用的属性是lengthprototype,而最常用的方法是call()apply()

function foo() {}

console.log(foo.length); // 0

console.log(typeof foo.prototype); // "object"

length属性记录了函数定义时声明的参数个数。prototype属性是一个指针,指向函数的原型对象。

call()apply()方法用来调用函数,并指定函数内部的this值:

function sayHi() {
    console.log('Hi, ' + this.name + '!');
}

var person = {
    name: 'Mike'
};

sayHi.call(person); // "Hi, Mike!"

call()apply()的区别在于传入参数的方式不同。对于call(),需要将参数一个一个传递进去:

sayHi.call(person, arg1, arg2, arg3);

对于apply(),需要将参数封装在一个数组中传递:

sayHi.apply(person, [arg1, arg2, arg3]);

什么是构造函数?

构造函数不同于普通函数,其主要使用场景是用于创建对象和对象的实例化。构造函数同样也是函数,只是其使用方式不同,构造函数通过new操作符来进行实例化。

构造函数的特点:

  • 构造函数名通常首字母大写
  • 构造函数内部使用this关键字代表对象实例
  • 构造函数内部为对象实例添加属性和方法

以下是一个构造函数的示例:

function Person(name) {
    this.name = name;
    this.sayHi = function() {
        console.log('Hi, ' + this.name + '!');
    };
}

var person1 = new Person('Mike');
var person2 = new Person('Lucy');

实例化后,可以通过person1person2访问对象的属性和方法:

console.log(person1.name); // "Mike"
console.log(person2.name); // "Lucy"

person1.sayHi(); // "Hi, Mike!"
person2.sayHi(); // "Hi, Lucy!"

构造函数可以通过prototype属性来添加所有实例都可以共享的属性和方法:

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

Person.prototype.sayHi = function() {
    console.log('Hi, ' + this.name + '!');
};

var person1 = new Person('Mike');
var person2 = new Person('Lucy');

最终代码示例:

function Person(name) {
    this.name = name;
    this.sayHi = function() {
        console.log('Hi, ' + this.name + '!');
    };
}

Person.prototype.sayBye = function() {
    console.log('Goodbye, ' + this.name + '!');
};

var person1 = new Person('Mike');
var person2 = new Person('Lucy');

console.log(person1.name); // "Mike"
console.log(person2.name); // "Lucy"

person1.sayHi(); // "Hi, Mike!"
person2.sayHi(); // "Hi, Lucy!"

person1.sayBye(); // "Goodbye, Mike!"
person2.sayBye(); // "Goodbye, Lucy!"

以上是JS深入浅出Function与构造函数的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS深入浅出Function与构造函数 - Python技术站

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

相关文章

  • 如何在VSCode Webview中打开一个新的页面

      上一篇我介绍了如何在VSCode Webview中实现点击链接下载图片或文件,本文介绍如何在默认浏览器中打开一个新的页面。   在浏览器中,如果要实现打开一个新的页面有许多种不同的方法,例如: window.open(“https://www.cnblogs.com/jaxu”, “_blank”);   或者直接在页面上放一个<a>标签:&…

    JavaScript 2023年5月9日
    00
  • JavaScript阻止事件冒泡示例分享

    关于“JavaScript阻止事件冒泡示例分享”的完整攻略,我将从以下两个方面进行详细讲解。 1. 什么是事件冒泡 在讲解如何阻止事件冒泡之前,我们需要先了解一下什么是事件冒泡。 事件冒泡是浏览器处理事件的一种机制,即当后代元素触发事件时,该事件会一层层地向上级元素(父级元素)传递,直到最终传递到文档对象,也就是最顶级的元素。 2. 如何阻止事件冒泡 通常来…

    JavaScript 2023年6月10日
    00
  • JavaScript变量详解

    JavaScript变量是指在程序中用来存储数据的容器。在JavaScript中,变量的声明需要使用关键字var、let或const来标识。 1. 变量声明和赋值 变量声明和赋值可以在同一行完成,也可以分开进行。 使用var声明变量: var age; age = 30; 或者在同一行完成: var age = 30; 使用let声明变量: let age;…

    Web开发基础 2023年3月30日
    00
  • 写出更好的JavaScript程序之undefined篇(中)

    针对“写出更好的JavaScript程序之undefined篇(中)”这篇文章,我来进行详细的讲解攻略,包括以下几个方面: 理解undefined的含义 undefined是JavaScript中的一个关键字,指的是一个变量或属性没有被赋值,或者被赋值为undefined。例如以下代码片段中的变量a和b都是undefined: var a; var b = …

    JavaScript 2023年5月27日
    00
  • JavaScript Array对象扩展indexOf()方法

    JavaScript中的Array对象是非常常用的一种数据结构,它是一种有序的集合,可以存储多个数据类型的值。indexOf()是Array对象中的一个方法,用于查找指定元素在数组中第一次出现的位置。但是,它并不是一个完美的方法,因为它无法处理“NaN”以及“+0”与“-0”如何处理的问题。 为了解决这些问题,我们可以采用一些技巧来修改Array对象的ind…

    JavaScript 2023年6月10日
    00
  • Js 时间间隔计算的函数(间隔天数)

    下面我来详细讲解“Js 时间间隔计算的函数(间隔天数)”的完整攻略。 1. 需求分析 首先,我们需要明确这个函数的具体需求。根据题目,我们需要实现一个函数来计算两个日期之间的间隔天数。例如,对于输入的日期字符串 “2021-01-01” 和 “2021-01-05″,函数应该返回 4。 2. 时间格式转换 首先,我们需要将日期字符串转换成 JavaScrip…

    JavaScript 2023年5月27日
    00
  • 改版了网上的一个js操作userdata

    改版了网上的一个js操作userdata,意味着我们要掌握如何在 JavaScript 中使用 localStorage API 操作本地存储空间。下面将从以下四个方面讲解完整攻略: localStorage 的概念和用法 基础操作:setItem 和 getItem 复杂数据结构的存储和读取 注意事项 1. localStorage 的概念和用法 loca…

    JavaScript 2023年6月11日
    00
  • javascript prototype的深度探索不是原型继承那么简单

    下面我将为你详细讲解“Javascript Prototype的深度探索不是原型继承那么简单”的完整攻略。 一、了解prototype 在Javascript中,每个对象都有一个prototype属性,这个属性指向了它所对应的构造函数的原型对象(也称为原型),也是实现JavaScript中原型继承的关键。 示例代码: function Person(name…

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