1. 五种声明方式
1.1 具名函数
function f(x,y) { return x+y }
f.name // 'f'
1.2.匿名函数
var f;
f = function(x,y){
return x+y
}
f.name // 'f'
1.3 具名函数赋值
var f;
f = function f2(x,y){ return x+y }
f.name // 'f2'
console.log(f2) // undefined
1.4 window.Function
var f = new Function('x','y','return x+y')
f.name // "anonymous"
1.5 箭头函数
var f = (x,y) => { return x+y}
var sum = (x,y) => x+y
var n2 = n => n*n
2. 函数的本质
函数:可以执行代码的对象就是函数。
函数调用:f.call(undefined,1,2)
从第二个开始传第一个参数
functionf(x,y){return x+y}
f.call(undefined,1,2) // 3
f.call(undefined,3,4) // 7
3. this 和 arguments
如何调用函数
f.call(asThis, input1,input2)
其中 asThis 会被当做 this,[input1,input2] 会被当做 arguments
禁止使用 f(input1, input2),因为学会 .call 才能理解 this
function f(){
'use strict'
console.log(this)
console.log(arguments)
return undefined
}
f.call(1,2,3) // this 为 1,arguments 为 [2,3]
this: call 的第一个参数(undefined)
arguments:call 的后面的参数可以用arguments得到
4. Call Stack 和 递归
5. 作用域 和 变量提升
变量提升
作用域 与 变量提升的三大面试题
1 拿到题目,先变量提升
var a = 1;
function f1(){
alert(a) // 是多少
var a = 2
}
f1.call() //undefined
2
var a = 1;
function f1(){
var a = 2
f2.call()
};
function f2(){
console.log(a)
}
f1.call() //1
3
var liTags = document.querySelectorAll('li')
for(var i = 0; i<liTags.length; i++){
liTags[i].onclick = function(){
console.log(i) // 点击第3个 li 时,打印 2 还是打印 6?
}
} //6