JS的函数

引用地址

let fn = () => console.log(‘hi’)
let fn2 = fn
fn2()

fn保存了匿名函数的地址
这个地址被复制给了fn2
fn2()调用了匿名函数
fn和fn2都是匿名函数的引用而已
真正的函数不是fn也不是fn2

函数对象

let fn = () => ({ name: xxx })

在块级作用域外加圆括号会自动将块级作用域转化为对象

调用时机

调用的时机不同,结果不同

根据函数的调用时机,打印出相应的结果

作用域

在这里插入图片描述

function f1(){
let a = 1
function f2(){
let a = 2
console.log(a) // 后打印这个
}
console.log(a) // 先打印这个
a = 3
f2()
}
f1()

闭包

函数引用外部变量就是 闭包

形式参数

在这里插入图片描述

返回值

在这里插入图片描述

调用栈

在这里插入图片描述

阶乘和递归

function f(n){
return n !== 1 ? n* f(n-1) : 1
}
// 递归,先递进在回归
f(4)
= 4 * f(3)
= 4 * (3 * f(2))
= 4 * (3 * (2 * f(1)))
= 4 * (3 * (2 * (1)))
= 4 * (3 * (2))
= 4 * (6)
24

爆栈
如果调用栈中压入的栈过多,程序就会崩溃

函数提升

在这里插入图片描述

arguments(除了箭头函数)和this(除了箭头函数)

每个函数都有arguments和this,除了箭头函数
在这里插入图片描述

this是隐藏参数,arguments是普通参数

假如没有this

let person = {
name: 'frank',
sayHi(){ // 解析时,函数会提到第一位
console.log(`你好,我叫 ` + person.name) // 解析时,变量会排在函数后面
}
}
// 我们可以用直接保存了对象地址的变量,获取‘name’
// 我们把这种办法简称为引用

问题一

let sayHi = function(){
console.log(` 你好,我叫` + person.name)
}
let person = {
name: 'frank',
'sayHi': sayHi
}
// person 如果改名,sayhi函数就挂了
// sayHi函数甚至有可能在另一个文件里面
// 所以不想看到sayHi函数里出现person引用

问题二

class Person{
constructor(name){
this.name = name
// 这里的this 是 new 强制指定的
}
sayHi(){
console.log(???)
}
}
// 这里只有类,还没创建对象,故不可能获取对象的引用

怎样拿到对象的name属性

用参数拿

// 对象
let person = {
name: 'frank',
sayHi(p){
console.log(` 你好,我叫 ` + p.name)
	}
}
person.sayHi(person)
// 类
class Person{
constructor(name){ this.name = name }
sayHi(p){
console.log(` 你好,我叫 ` + p.name)
	}
}

person.sayHi() 会隐式地把 person作为 this传给sayHi

方便sayHi获取person对应的对象
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Supernova_gu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值