函数是对象
所有的函数都是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 也是
复制代码
函数的要素
-
每个函数都有这些东西
- 调用时机
- 作用域
- 闭包
- 形式参数
- 返回值
- 调用栈
- 函数提升
- arguments(除了箭头函数)
- 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)
复制代码
作用域
- 在顶级作用域声明的变量是全局变量
- window 的属性是全局变量,在哪都可以用,其他都是局部变量
let b 为局部变量 ,只能在{}中使用
多个作用域有同名变量a
- 查找a时,向上取最近的作用域,就近原则
函数调用
- 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