首先var定义的变量或者直接在全局作用域声明的函数,都是存在windows中的
    而 ES6中的let和const声明的变量和方法是单独生成一个块来保存的
    建议使用let,const来声明。避免污染全局windows的方法和属性
    函数执行期上下文

    1. function text(a,b) {
    2. console.log(a)
    3. c = 0
    4. var c
    5. a = 5
    6. b = 6
    7. conole.log(b)
    8. function b() {}
    9. function d() {}
    10. console.log(b)
    11. }
    12. text(1)
    13. // 创建AO = {
    14. a = undefined > 1 > 5
    15. b = undefined > function b() {} > 6
    16. c = undefined > 0
    17. d = function d() {}
    18. }
    19. // 输出 1,6,6
    20. // 首先找到函数中的变量,然后将实参定义形参及函数,然后是赋值

    函数的arguments获取实参,length获取行参的个数

    1. function text(a,b,c){
    2. console.log(text.arguments) //已堆的形式存储【1,2,3】
    3. }
    4. text(1,2,3)

    函数的优化=>箭头函数

    1. let array = [1,2,3,4,5,6].filter(function(value, index) {
    2. return value >= 3
    3. })
    4. let array = [1,2,3,4,5,6].filter(value=> value >= 3)

    首先将function函数去掉使用=>箭头 , 如果函数参数为一个可以去掉(),如果表达式为一行可以将return去掉,默认return。
    函数中this

    1. const obj = {
    2. name: 'qihuanran',
    3. fun() {
    4. console.log(this.name) // qihuanran
    5. function nes() {
    6. console.log(this.name) // undefined
    7. }
    8. }
    9. }
    10. obj.fun()

    image.png当函数以对象属性的形式出现时、this指向当前的对象。不以对象属性出现时this指向window。
    如果想让函数nes指向对象,可以在nes外部定义let This = this因为外部的this指向当前对象。
    函数递归
    就是函数调用自己

    1. function text(n){
    2. return text(n) * 1
    3. }
    4. consloe.log(text(4)) // 4