日期简介:
说明: Date属于引用类型,引用类型是一种数据结构,用于将数据和功能组织在一起,如var newDate = new Date(),这行代码创建了Date引用类型的一个新实例,保存在newDate中,使用的构造函数是Date,它只为新对象定义了默认的属性和方法.
函数类型:
说明: Function类型实际上是对象,每个函数都是Function类型的实例,而且都与其它引用类型一样具有属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针
/* * 函数声明 */// 普的函数声明var max = function(x, y){ return x>y?1:(x==y?0:-1)}console.log(max(1, 2))// 使用Function构造函数var func= new Function('x', 'y', 'return x + y')console.log(func(1, 2))
注意:使用new Function方式声明函数对象,我们并不推荐,因为这种语法会导致解析两次代码(第一次常规解析,第二次解析传入构造函数中的字符串),会影响性能,这里主要是让大家理解函数是对象,函数名是指针
函数对象:
说明: Js中的函数名本身就是变量,所以函数也可以作为值来使用,也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回
var arr = [2, 3, 6, 1, 8, 9]var cmp = function(x, y){ return x>y?1:(x==y?0:-1)}/* 求最大值思路 * 1.用第二个值与第一个值比较,拿到最大值 * 2.将最大值赋值给第二个值,继续下一次循环 * */function max(cmp, arr){ var maxNum = null for(var i=1; i
内部属性:
说明: 函数内部有两个特殊对象,arguments(是一个类数组对象,包含传入函数的所有参数,主要用途是保存函数参数,它有一个非常有用的callee属性,该属性是一个指针,指向拥有arguments对象的函数,常用于递归函数)和this(表示函数调用语句所处的那个作用域,当在全局作用域中调用函数时,this对象引用的就是window,支持加点访问作用域内的一切属性和方法)
// 递归 - 常规递归写法,函数内部一定会调用自身,如果函数名变化,则内部函数名也必须改变function recursion(num){ if(num==1){ return 1 }else{ return num*recursion(num-1) }}// 递归 - 推荐递归写法,函数内部一定会调用自身,如果函数名变化,则内部函数名不需去改变function recursion(num){ if(num==1){ return 1 }else { return num*arguments.callee(num-1) }}console.log(recursion(100))// this - 全局作用域就是window,局部作用域就是局部对象window.color = 'red'// redconsole.log(this.color)var obj = { color: 'blue', getColor: function(){ // blue return this.color }}console.log(obj.getColor())
函数方法:
说明: Js中函数是对象,对象有属性和方法,那么函数也可有属性和方法,每个函数都包含两个属性length(表示函数希望接收的命名参数的个数)和prototype(保存所有实例方法的真正所在,也就是原型,它也有两个方法applay(scope, [arg1..argn])和call(scope, arg1...argn)),它们真正的作用在于扩展作用域实现不同作用域下的不同效果
function createApp(env){ /* 生成不同环境下的APP * test -> testScope * prod -> prodScope * */ var envInfo = 'env: ' + env + '\n' + 'host: ' + this.host + '\n' + 'port: ' + this.port alert(envInfo)}testScope = { host: '123.59.27.192', port: '8083'}prodScope = { host: '120.132.75.75', port: '8083'}// 基于测试环境对象调用createApp函数createApp.apply(testScope, ['test'])// 基于正式环境对象调用createApp函数createApp.call(prodScope, 'prod')
技巧: 使用call()和applay()来扩充作用域的最大好处就是对象不需要与方法发生任何耦合关系,更加便于扩展和维护,它们两个的区别在于传递参数的方式不同applay第二个参数是一个类数组对象即可(如果在函数内部可直接传递arguments),而call传递参数必须逐个传递