重学前端 19 # JavaScript中的函数

简介: 重学前端 19 # JavaScript中的函数

一、函数


1.1、普通函数

function 关键字定义的函数。

function kaimo(){
    // code
}


1.2、箭头函数

=> 运算符定义的函数。

const kaimo = () => {
    // code
}


1.3、方法

class 中定义的函数。

class KK {
    kaimo(){
        //code
    }
}


1.4、生成器函数

function* 定义的函数。这种声明方式会定义一个生成器函数 (generator function),它返回一个 Generator 对象。

function* kaimo(){
    // code
}


1.5、类

class 定义的类,实际上也是函数。

class KK {
    constructor(){
        //code
    }
}



1.6、异步函数

   普通函数、箭头函数和生成器函数加上 async 关键字。

async function kaimo(){
    // code
}
const kaimo = async () => {
    // code
}
async function kaimo*(){
    // code
}



二、this关键字


this 是执行上下文中很重要的一个组成部分。同一个函数调用方式不同,得到的 this 值也不

2.1、普通函数情况下

function showThis(){
    console.log(this);
}
var o = {
    showThis: showThis
}
showThis(); // global
o.showThis(); // o

   普通函数的 this 值由调用它所使用的引用决定。获取函数的表达式,返回的是一个 Reference 类型。Reference 类型由两部分组成:一个对象和一个属性值。


上面代码里 o.showThis 产生的 Reference 类型,即由对象 o 和属性showThis构成。


调用函数时使用的引用,决定了函数执行时刻的 this 值。


2.2、箭头函数情况下


const showThis = () => {
    console.log(this);
}
var o = {
    showThis: showThis
}
showThis(); // global
o.showThis(); // global



改为箭头函数后,不论用什么引用来调用它,都不影响它的 this 值。

2.3、方法情况下

// 这一个没怎么弄明白,mark一下
class C {
    showThis() {
        console.log(this);
    }
}
var o = new C();
var showThis = o.showThis;
showThis(); // undefined
o.showThis(); // o

首先创建了一个类 C,并且实例化出对象 o,再把 o 的方法赋值给了变量 showThis



三、this 关键字的机制



1、在 JavaScript 标准中,为函数规定了用来保存定义时上下文的私有属性 [[Environment]]。


2、当一个函数执行时,会创建一条新的执行环境记录,记录的外层词法环境(outer lexical environment)会被设置成函数的 [[Environment]]。


/* 执行上下文的切换机制 */
var a = 1;
foo();
// 在别处定义了 foo:
var b = 2;
function foo(){
    console.log(b); // 2
    console.log(a); // error
}

foo 能够访问 b(定义时词法环境),却不能访问 a(执行时的词法环境)



3、JavaScript 用一个 来管理执行上下文,这个栈中的每一项又包含一个链表。


3d695d78b2b80afb654ca2824a3f9ab4.jpg


当函数调用时,会入栈一个新的执行上下文,函数调用结束时,执行上下文被出栈。



4、[[thisMode]] 私有属性。


   lexical:表示从上下文中找 this,这对应了箭头函数。

   global:表示当 this 为 undefined 时,取全局对象,对应了普通函数。

   strict:当严格模式时使用,this 严格按照调用时传入的值,可能为 null 或者 undefined。


"use strict"
function showThis(){
    console.log(this);
}
var o = {
    showThis: showThis
}
showThis(); // undefined
o.showThis(); // o




四、操作 this 的内置函数


Function.prototype.callFunction.prototype.apply 可以指定函数调用时传入的 this 值。


function foo(a, b, c){
    console.log(this);
    console.log(a, b, c);
}
//call 和 apply 作用一样,只是传参方式有区别
foo.call({}, 1, 2, 3); // {} 1 2 3
foo.apply({}, [1, 2, 3]); // {} 1 2 3


   Function.prototype.bind 它可以生成一个绑定过的函数,这个函数的 this 值固定了参数

function foo(a, b, c){
    console.log(this);
    console.log(a, b, c);
}
foo.bind({}, 1, 2, 3)(); // {} 1 2 3



目录
相关文章
|
22小时前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
8 2
|
22小时前
|
JavaScript 前端开发
JavaScript函数核心概念:用于代码复用与管理。
【6月更文挑战第25天】JavaScript函数核心概念:用于代码复用与管理。示例包括定义(无参、有参、有返回值)与调用,参数按值传递。函数内修改参数不影响外部变量。
6 1
|
2天前
|
前端开发 JavaScript Serverless
前端新手建议收藏的JavaScript 代码技巧
前端新手建议收藏的JavaScript 代码技巧
12 3
|
3天前
|
JavaScript 前端开发
JavaScript函数是代码复用的关键。使用`function`创建函数
【6月更文挑战第22天】JavaScript函数是代码复用的关键。使用`function`创建函数,如`function sayHello() {...}`或`function addNumbers(num1, num2) {...}`。调用函数如`sayHello()`执行其代码,传递参数按值进行。函数可通过`return`返回值,无返回值默认为`undefined`。理解函数对于模块化编程至关重要。
16 4
|
2天前
|
设计模式 前端开发 JavaScript
关于写好前端JS代码的一些建议
关于写好前端JS代码的一些建议
13 2
|
2天前
|
设计模式 JavaScript 前端开发
JS 代码变量和函数的正确写法大分享
在开发中,变量名,函数名一般要做到清晰明了,尽量做到看名字就能让人知道你的意图,所以变量和函数命名是挺重要
11 2
|
4天前
|
JavaScript 前端开发 索引
第四篇-Javascript函数
第四篇-Javascript函数
11 3
|
6天前
|
设计模式 JavaScript 前端开发
JS 代码中变量和函数的正确写法总结
**代码规范与最佳实践摘要** 1. 使用可读性强的变量名,如`currentDate`代替`yyyymmdstr`。 2. 对同一类型变量使用相似命名,如`getUser()`代替`getUserInfo()`。 3. 变量名应具有描述性,避免使用难以理解的数字,如`MILLISECONDS_IN_A_DAY`代替`86400000`。
20 2
|
15小时前
|
JavaScript
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
|
4天前
|
JSON JavaScript 前端开发
JS常用的几种函数
JS常用的几种函数
4 0