引用地址
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对应的对象