JS函数

函数是对象
所有的函数都是Function构造出来的,包括(Object,Array,Function)

如何定义一个函数

具名函数

function 函数名(形式参数1,形式参数2){
  语句
  return 返回值
}
复制代码

匿名函数

function 函数名(形式参数1,形式参数2){
  语句
  return 返回值
}

**去掉上面的函数名就是匿名函数
let a = function(x,y){
                  ↓           
                 参数
  return x+y
          ↓
          返回这个参数
  }
  
 *声明一个变量a并且把它赋值为,左边为赋值,右边是函数表达式
 *也叫函数表达式
复制代码
let a = function fn(x,y){return x+y}

fn(x,y)

* 报错 fn的作用域只在右边,非常有限。 如果没有let a 则可以
复制代码

箭头函数

let f1 = x => x*x

*在f1里输入一个x参数,输出x*x

*如果有两个输入参数,要用()括起来
复制代码
*如果有两个语句
let f1 = (x,y) => {
  console.log('hi')
  return x*y
}

*加了{}必须写return,否则js不知道执行啥
复制代码
let f1 = x => { name:x }
*执行f1为undefined ,js认为后面不是一个整体,只是一个标签,要加()
let f1 = x => ({ name:x })
复制代码
let fn = () => console.log('hi')

fn
*不会有任何结果,因为fn没有执行,fn()才能执行
复制代码
let fn = () => console.log('hi')

let fn2 = fn

fn2()

*fn 保存了匿名函数的地址

*这个地址被复制给了 fn2

*fn2() 调用了匿名函数

*fn 和 fn2 都是匿名函数的引用而已

*真正的函数既不是 fn 也不是 fn2
复制代码

构造函数

let f = new Function('x', 'y', 'return x+y')

基本没人用,但是能让你知道函数是谁构造的

所有函数都是 Function 构造出来的

包括 Object、Array、Function 也是
复制代码

函数的要素

  • 每个函数都有这些东西

    1. 调用时机
    2. 作用域
    3. 闭包
    4. 形式参数
    5. 返回值
    6. 调用栈
    7. 函数提升
    8. arguments(除了箭头函数)
    9. this(除了箭头函数)

调用时机

let a = 1
function fn(){
  console.log(a)
}
*上面代码不会打印出什么,因为没有调用fn这个函数
复制代码
let a = 1
function fn(){
  console.log(a)
}
a = 2
fn()

* 上面代码会打印出2,因为a已经变成了2
复制代码
let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
复制代码

上面代码问打印出什么,答案是6个6,首先i后面只有一个值,setTimeout的意思是你去数苹果有多少个,数着数着,你妈妈问你一共有几个苹果,你告诉妈妈最终的数字就行,即让你运行完i的值,过一会马上打印出i的最终值,当i为6时,刚好满足i<6,所以循环了6次

那怎么让它打印出0,1,2,3,4,5呢?

  • 方法一
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
},0)
}
复制代码

只需要把let放到里面即可

  • 方法二
for(let i = 0; i < 6; i++){
 setTimeout(i => console.log(i), 0,  i )
}
console.log(-1)
复制代码

作用域

1.png

  1. 在顶级作用域声明的变量是全局变量
  2. window 的属性是全局变量,在哪都可以用,其他都是局部变量

let b 为局部变量 ,只能在{}中使用

多个作用域有同名变量a

  1. 查找a时,向上取最近的作用域,就近原则

3.png

函数调用

  • call
let person = {
  name:'frank',
  sayHi(){
    console.log(this.name)
  }
}
person.sayHi.call({name:'jack'})
----------------
  call后面传什么this就是什么,即上面的this是jack
  
person.sayHi.call(person)
-----------------
  即上面的this是person
复制代码
function add(x,y){
  return x+y
}
add.call(undefined,1,2)
----------
如果不用this通过call调用函数,需要用undefined(或者其它)来占位
复制代码
  • apply
function add(x,y){
  return x+y
}
add.apply(undefined,[1,2])
------------
apply的用法就是在后面加上[]
复制代码
  • bind
使用.bind可以让this不被改变

function f1(p1,p2){
  console.log(this,p1,p2)
}
let f2 = f1.bind({name:'frank'})
------------
f2就是f1绑定this之后的新函数,即frank
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享