SOURCE

// 函数在JS中是一等公民,是第一类对象,即可声明为变量,又可以是函数的形参、返回值,
// 对象能做的事,函数都可以做

// ----------------------函数的声明--------------------------------
// 在ES5中声明函数的方式有两种,1:字面量声明,2:将函数声明成变量
// 1.字面量声明,任何地方都可以调用,不会报错
// foo() 
function foo(x,y){
    console.log("字面量声明函数: "+x +" "+ y)
}
foo(1,"33")

// 2.函数声明成变量:声明的作用域必须高于或平于调用者并且先声明,否则会报错
// text() // 报错 ,没有预先声明
let text = function(str){
    console.log("函数声明成变量: "+str)
}
text("test") // 不会报错

// ES6 可以用箭头函数来声明,箭头函数不用funtion声明定义
// 箭头函数:箭头左边是形参,右边是函数体
let sum = (x,y) =>{
    return x+y
}

console.log(sum(1,3))

// 如果箭头函数体内返回值只有一行,可以省略{}和return
let sum1 = (x,y) => x +y 
console.log(sum1(1,3))

//----------------- 函数的调用-------------------
// 函数的调用有:作为函数的调用,作为方法的调用,作为构造器的调用
// 1、作为函数的调用,很简单如下:
var bar = function(){
    console.log("作为函数的调用")
}
bar() // 以()方式调用,就是以函数的方式调用,无论在哪里上下文this都是window
// 2、作为方法的调用,如果对象的属性引用是指向一个函数的情况,通过[对象.属性]方式就是方法的调用
// 方法是存在于对象中,也就是对象的属性,与Java是类似的
var obj = {
    birth: 1990,
    // getAge属性作为一个方法调用,方法存在于对象之中,
    // 因此getAge的方法体内的最近的this是指向obj对象
    getAge: function () {
        var b = this.birth; // 1990
        console.log("b: "+ this.birth)
        var fn = function () {
            // 函数fn并不是obj对象中的属性,因此函数体内的this是指向window
            console.log("this: "+this+" fn: "+ this.birth) // this指向window或undefined
            function test(){
                console.log("this2: "+this) 
            }
            test()
            return new Date().getFullYear() 
        };
        return fn();
    }
};

console.log(obj.getAge())

// 箭头函数有三个特征:
// 1、函数体没有自己的this,this是指向最近外层的调用者
// 2、不可以作为构造函数;3、不可以使用argments参数


//------------改变this的指向--------------------
console 命令行工具 X clear

                    
>
console