// 函数在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