Js基础总结二

函数的定义与调用

定义一个绝对值函数 method(args){} 这里的args 在传入参数时没有限制,可以多个。

function abs(x) {
    if (x >= 0) {
        return x;
    } else {
        return -x;
    }
}

传一个参数

var abs1 = abs(-1);
console.log(abs1);

传多个参数, 只会获取第一个

var abs2 = abs(-898,'xxxx',-7777);
console.log(abs2);

function 传入的参数,会装在一个arguments 数组里面

function multiplyArgs(){
	var args=[];
	//输出传入进来的参数
	for(var i in arguments){
		args[i]=arguments[i];
	}
	console.log(arguments.length);
	console.log(args);
}
multiplyArgs(123,'ffewi',['a','b','c']);

变量/常量

主要是全局变量以及局部变量,和常量。

全局变量

var globalVar = 'this is globalVar';
function partVar(){
	var part1 = "just part variable";
	console.log("全局变量"+globalVar+"  局部变量"+part1);
}
partVar();
console.log("全局变量"+globalVar+"  局部变量"+'part1');//part1 is not defined

ES6标准引入了新的关键字const来定义常量,const与let都具有块级作用域 let 需要声明在{}中

const var1 = 3.14,var2='aa';
var1 = 3.88;//不可以修改了
var2 = 3.88;//必须在初始化时赋值
console.log(var1+"  "+var2); 
function letVar(){
	let v1;
	alert(v1);
	//let var3;//怎么无效
	if(true){
		let var3 = 3.88;
		alert(var3);
		console.log(var3);
	}
	
}
letVar();

方法

定义一个带方法属性的对象

var ffewi = {
	name:'ffewi',
	birth:1993,
	age:function(){
		var date = new Date().getFullYear();
		return date - this.birth;
	}
}
console.log("ffewi:["+ffewi.name+","+ffewi.birth+","+ffewi.age()+"]");

如果把function() 提到外边,效果不一样。

function getAge(){
	var date = new Date().getFullYear();
		return date - this.birth;
}
//此时 age :NaN  原因是 this对象获取不到ffewi的birth属性值
ffewi.age=getAge();

为什么:修改对象获取方式 function 调用时,没有对象进去,自动获取的windows对象 而windows.birth为undifined。

怎么解决:通过 apply(object,args[]) 修复对象丢失,同样的方法 还有 call(object,args1,args2,…)。

age = getAge.apply(ffewi,[]);
age = getAge.call(ffewi,null,null);

高阶函数

方法中传入参数带有函数进入,返回函数对象 如:

a , b 为数值参数,f为函数对象。

function add(a,b,f) {
	return f(a)+f(b)
}

function f(args){
	if(args<0)
		return -args;
	return args;
}

下面效果为绝对值相加。

var result = add(-123,-16,f);
console.log(result);

map/reduce filter sort

javascript自带有的高阶函数。

map

object.map(fun());

对于object里面的对象逐一进行fun() 如:

var arr1 = [1,3,5,7,9];
function pow2(args){
	//console.log(args);
	return args*args;
}
console.log("进行map函数之前:"+arr1);//1,3,5,7,9
var catresult = arr1.map(pow2);// 1,9,25,49,81
console.log("进行map函数之后:"+catresult);

reduce

object.reduce(fun());

对于object里面的对象进行两两fun() 如:

var arr2 = [1,2,3,4,5,6,7,8,9,10];
function sum(a,b){
	return a+b;
}
var sums = arr2.reduce(sum);
console.log("arr2:  "+arr2+" 里面elements total sum : " +sums);

filter

将里面符合要求的过滤出来

var arr3 = ['A','C',33,'B',44,'894'];
var re3 = arr3.filter(function(a){return !isNaN(a)});
console.log(re3);

sort

sort 函数比较简单;

大概是这样的:

sort();

sort(function(){

//自己定义的比较回调函数,应该是这个意思

})

var arr4 = [1,7,5,67,8];
var re4 = arr4.sort();
console.log(re4);

arr4 = [1,3,5,967,8];
var re5 = arr4.sort(function(a,b){
	if(a>b){
		return 1;
	}else if(a<b){
		return -1;
	}else{
		return 0;
	}
	});
console.log(re5);

闭包

一个比较繁琐的函数问题, Ta使函数返回的值是函数。。。

闭包的使用 模拟面向对象 private成员。

function counter_timer(init){
	var x = init || 0;//保证不传值时初始化x=0
	return {
		inc: function (){
			x +=1;
			return x;
		}
	}
}
var ct = counter_timer();
console.log(ct.inc()+" 函数本身:"+ct.inc);
console.log(ct.inc()+" 函数本身:"+ct.inc);
console.log(ct.inc()+" 函数本身:"+ct.inc);
//带初始值的
var ct1 = counter_timer(100);
console.log(ct1.inc()+" 函数本身:"+ct1.inc);
console.log(ct1.inc()+" 函数本身:"+ct1.inc);
console.log(ct1.inc()+" 函数本身:"+ct1.inc);
console.log(('x' in ct1)+" "+ct1.x);

模拟一个x的n次方

function pown(x){
	return function(n){
		return Math.pow(x,n);
	}
}
var p = pown(2);
console.log(p(5));//2的5次方
var p1 =pown(3);
console.log(p1(3));//3的3次方
//可以这样输出哦
console.log("5'2次方=:"+pown(5)(2));
一个用自然语言的命令玩法

定义:

初步分析了下 f为函数 x 为参数内容

zero()(var);

传入什么,返回什么

var zero = function(f){
	return function(x){
		return x;
	}
}

one(fun)(var);

定义一个函数fun,后面为函数的参数

var one = function(f){
	return function(x){
		return f(x);
	}
}

add(fun1, fun2);

两个函数操作:

返回fun2(fun)(fun1(fun)(var2));
–> fun1(fun)(var2) = var2;
–> fun2(fun)(var2);
则表示 fun1运行一次,fun2运行一次。
返回结果为fun2(f)(v)中f的返回值。

var add = function(n,m){
	return function(f){
		return function(x){
			return m(f)(n(f)(x))
		}
	}
}

console.log(zero()("初始值为0"));
(one(function (x){
	console.log(x);
}))("这里就是我要打印的东西,而且只打印了一次!");
var three = add(one,(add(one,one)));
console.log(three);

three(function (x){
	if(!x || x == 0){
		console.log("默认第一次打印,或者指定为0次打印!");
	}else
		console.log("这里就是我要打印的东西,而且这是"+x+"次打印了!");
	return (x || 1) + 1;
})(0);

Arrow Function(箭头函数)

箭头函数,顾名思义 可以用 =>来指定一个函数体 如:

方法 method= 参数 x => 指向函数运算 x*x。

var m1 = x => x*x;

var ob = (name,age,habits) => ({
	ffewi:{
		name:name,
		age:age,
		habits:habits
	}
});

//结果是一个对象 看起来是不是有点像java中的对象构造方法
var myself =ob('ffewi',23,['java','js','sql']);

//重写写toString
myself.toString=(function(){
	return "["+this.name+","+this.age+","+this.habits+"]";
}).apply(myself.ffewi);
console.log(myself.toString);

//其它方法
function toString1(){
	return "["+this.name+","+this.age+","+this.habits+"]";
};
//alert(toString1.apply(myself.ffewi,null));
console.log(ob('ffewi',23,['java','js','sql']));

来看看箭头函数的 this Ta指向的是调用者

定义一个箭头函数

var mthis = ()=>{
	if(this.bb!=null)
		alert(this.bb);
		return this.bb+"  [ffewi]";
	if(this.bb!=undefined)
		return this.bb='sdf';
};
var t1 ={
	name:'ffewi',
	bb:'ooooo',
	birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
        return fn();
    }
}
console.log(t1.getAge()+"  "+t1.bb);

generator(生成器)

generator(生成器)是ES6标准引入的新的数据类型。 一个generator看上去像一个函数,但可以返回多次。
声明方式 : function* method(){}

斐波那契函数 1 1 2 3 5 8 13…

function* fb(max){
	var a=1,b=1,t;
	do{
		yield a;
		t=a+b;
		a=b;
		b=t;
	}while(max>=a)
	return a;
}
console.log(fb(60));
var arr =[];
for(var v of fb(55)){
	arr.push(v);
}
console.log(arr);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值