函数相关

1. 函数的五种声明方式

  1. 具名函数

    1
    2
    3
    4
    function f(x,y){
    return x+y
    }
    f.name // 'f'
  2. 匿名函数

    1
    2
    3
    4
    5
    var f
    f = function(x,y){
    return x+y
    }
    f.name // 'f'
  3. 具名函数赋值

    1
    2
    3
    4
    var f
    f = function f2(x,y){ return x+y }
    f.name // 'f2'
    console.log(f2) // undefined
  4. window.Function

    1
    2
    var f = new Function('x','y','return x+y')
    f.name // "anonymous" //匿名
  5. 箭头函数

    1
    2
    3
    4
    5
    var f = (x,y) => {
    return x+y
    }
    var sum = (x,y) => x+y
    var n2 = n => n*n

2. 调用函数

1
2
3
4
var f = function(){x,y}
return x+y
f(x,y)
f.call(undefined,x,y)

3. this 和 arguments

1
2
3
4
5
6
7
function f(){
'use strict'
console.log(this)
console.log(arguments)
return undefined
}
f.call(1,2,3) // this 为 1,arguments 为 [2,3]

方应杭老师关于 this 的解释

3. 作用域

  • 按照语法树,就近原则。
  • 我们只能确定变量是哪个变量,但是不能确定变量的值。
  • 3个关于作用域的面试题:拿到代码请先提升声明。
    面试题1

    1
    2
    3
    4
    5
    6
    var a = 1
    function f1(){
    alert(a) // 是多少
    var a = 2
    }
    f1.call()

    面试题2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var a = 1
    function f1(){
    var a = 2
    f2.call()
    }
    function f2(){
    console.log(a) // 是多少
    }
    f1.call()

    面试题3

    1
    2
    3
    4
    5
    6
    var liTags = document.querySelectorAll('li')
    for(var i = 0; i<liTags.length; i++){
    liTags[i].onclick = function(){
    console.log(i) // 点击第3个 li 时,打印 2 还是打印 6?
    }
    }

3.闭包

如果一个函数,用了它范围外的变量,那么(这个函数 + 这个变量)就叫做闭包。
方应杭老师关于闭包的解释