一.return函数
1.所有表达式都有返回值,我们自己写的函数默认返回值都为undefined。
当我们console一个函数时,会打印函数的本身。
function a(){
console.log(123)
return function(){
console.log(78)
}
}
let x = a() //此处将函数a的返回值给x,x还是一个函数
console.log(x) //此处a执行了一下,打印123,x为函数,所以打印函数function(){ console.log(78)}
console.log(x()) //此处函数x执行了,打印78,因其又打印函数的返回值,所以为undefined
console.log(a) // 此处打印function(){ console.log(78)}
a() // 123
a()() // 123 78
2.rerurn会立即结束一个函数,且return只对最近的函数有效
function fn(){
console.log(1)
console.log(2)
return
console.log(3) // 此处打印1,2,不会打印三
}
二.this指向补充
1. 全局this
函数的作用域是在定义函数时决定的,不是执行时决定的;this 指向是在执行时决定的,不是定义时决定的。
console.log(this) // window
function aa(){
console.log(this) // window
}
aa();
document.onclick = aa //document,事件被执行,指向事件触发的主体
let csdn = {
name:"csdn",
say:function(){
console.log(this)
}
}
csdn.say(); //构造一个对象,执行里面的函数,this指向对象本身
场景:
- 函数自执行,this指向window
- 函数被执行,this指向事件对应的节点
- 函数为对象里面的某个属性时,this指向这个对象
2. this指向的改变
call
function a(){
console.log(this)
}
a() //window
a.call(document) //document
bind
let s = {n:1,a:2}
function a(){
console.log(this)
}
document.onclick = a.bind(s)
call和bind的区别:
添加到事件函数中去时,call会自动执行一次,而Bind不会,所以若将上段代码中的bind换为call,不用点击就会打印对象s。
apply
function a(){
console.log(this)
}
a() //window
a.apply({y:20}) // {y:20}
apply也不会自动执行,和call的区别如下:
function fn(a,b){
console.log(a+b)
console.log(this)
}
fn(1,2) // 3 window
fn.call({x:10},1,2) // 3 {x:10}
fn.apply({y:20},[1,2]) // 3 {y:20}