js学习

6 篇文章 0 订阅
3 篇文章 0 订阅

学习了 表严肃的视频
关于回调函数(回调函数有无名字都可以):

这种情况我们就可以把我们想做的写到一个函数里,交给买()来执行:

function 买(一旦交易成功) {
  console.log('交易成功')

  /*检测是否有回调函数*/
  if(一旦交易成功) {
    /*如果有回调函数就触发它*/
    一旦交易成功();
  }
}

function 发货() {
  console.log('发货');
  console.log('短信通知买家已发货');
}
买(发货);   //调用时传个函数名进去即可

或者在调用时接收匿名的回调函数

function fun1(arr,fun2) {   //定义fun1
	console.log(arr);
	fun2(arr);
}  

fun1(12,function (data) {    //调用fun1时传入的函数是匿名函数
	if(data > 9)
	 console.log(data);
});

如何动态的获取传参?(并不限制传参的个数)
使用arguments关键词

定义全局变量var a = 1;等价于 window.a = 1,定义的全局变量相当于给window对象增加一个属性,所以要谨慎定义全局变量,因为你定义的全局变量可能会覆盖window对象原生的同名属性。

闭包就是函数套函数,闭包当成getter/setter来用,如下:

function user(name) {
	var sex,age;
	return {     //return返回一个对象
		getName: function() {
			return name;
		},             //记得加逗号
		setName: function(newName) {
			name = newName;
		},         //记得加逗号
		getSex: function() {
			return sex;
		},
		setSex: function(newSex) {
			sex = newSex;
		},
		getAge: function() {
			return age;
		},
		setAge: function(newAge) {
			age = newAge;
		},
	}
}

var whh = user('wang hua hua');
whh.setAge(20);
whh.setSex('female');

var name = whh.getName();
var sex = whh.getSex();
var age = whh.getAge();
console.log(name,sex,age);

关于时间的函数:

var count = 0;
var timer1 = setInterval(function(){
	count++;
	if(count > 3) {
		clearInterval(timer1);  //清除定时器timer1,防止无限地打印
		return; // 要加return 的原因是就算clearInterval实行了清除定时器timer1,也会把当前的function执行完(也就是会输出4),所以要加return
	}
	console.log(count);
},1000);

匿名函数调用方法:

(function(){ 定义函数体 内部的this是undified })();

this 的三种情况,this不取决于它所在的位置,它取决于它所在的函数是怎样被调用的:
第一种:如果是以 对象.方法A()(有点.) 的形式调用方法 ,那么方法A内的this就是父级对象
例如:

var person = {        //定义一个对象
	fname: 'hah',
	lname: 'li',
	fullname: function() {
		return this.fname + this.lname;   //此处的this等于父级对象也就是person对象
	}
}
person.fullname(); //是以 对象.方法A() 的形式调用,所以this等于父级对象也就是person对象

又或者:

 var person = {        //定义一个对象
    fname: 'hah',
    lname: 'li',
    a:{
	    fullname: function() {
	    	return this.fname + this.lname;   //此处的this等于父级对象也就是等于person里面的a对象
	    }
    },
}
  person.a.fullname(); //是以 对象.方法A() 的形式调用,所以this等于父级对象也就是a对象

第二种:如果是直接调用方法 方法B() (没有点.),那么方法B内的this就是undified(严格模式)或者window对象(非严格模式)。

 var person = {        //定义一个对象
    	fname: 'hah',
    	lname: 'li',
    	fullname: function() {
    		return this.fname + this.lname;   //此处的this等于父级对象也就是person对象
    	}
    }
  var getFullname = person.fullname;     //还可以这么玩,此时 fullname 还没有被调用
   getFullname();      //是以 方法B() 的形式调用(没有点),所以this等于undified或者window对象

第三种:如果用new的方式来定义,那么this 就是即将被创建的对象

function User() {
	this.name = 'whh';     //this 指得是 whh
	this.sex = 'girl';
}
var whh = new User();

这是this的程序:

function yo() {
	console.log('yo' + this.name);  //使用this可以动态赋值
}

var whh = {
	name: 'whh',
};

var lsd = {
	name: 'lsd',
};

whh.yo = yo;  //注意这里
lsd.yo = yo;
whh.yo(); //注意这里
lsd.yo();

调用函数 fun1();fun1.call( ); 是等同的,前者是后者的简写,使用call可以绑定对象到函数的this中:

 例子一: 
 function yo() {
    	console.log('yo :--' + this.name);
 }

var whh = {
	name: 'whh',
}; 
var lsd = {
	name: 'lsd',
};    
yo.call(whh);    //把whh对象绑定到yo函数的this中,直接执行yo函数
yo.call(lsd);  //把lsd对象绑定到yo函数的this中,直接执行yo函数



例子二
    function yo(kidname , age) {
    	console.log('yo :--' +kidname + age +this.name);
    }

var whh = {
	name: 'whh',
};

var lsd = {
	name: 'lsd',
};

yo.call(whh,'www',34);   //call函数的第一个参数是对象,后面的参数就一一对应
yo.call(lsd,'lll',23);
yo.apply(lxl,['lee',30]); //apply方式就是后面的参数以数组的形式传,直接执行apply函数
yo2 = yo.bind('whh');   //此时yo函数并没有执行,bind只是返回一个新函数
yo2('www',34);  //然后再执行新函数

触发函数执行的方法有4种:
1、

正常版

启动();

function 启动() {
  'use strict';
  // ...
}

2、

懒癌版

(function () {
  'use strict';
  // ...
})();

/*
可以这样理解
先用括号把这个匿名函数包起来:
(匿名函数)

然后执行:
(匿名函数)();
*/

3、

懒癌晚期版

!function () {  //注意前面有叹号!
  'use strict';
  // ...
}();

4、

懒癌领悟版

;(function () { // 行首的分号是干嘛的?
  'use strict';
  // ...
})();
那个分号是为了给前一个依赖文件擦屁股,js文件压缩时会依次将不同文件连接起来,然后去掉所有空格断行注释之类的东西,这样一来两个文件前后就黏一块了。压缩前好好的,压缩后就跑不起来了?卡了3天,没有任何头绪,难道代码需要呼吸?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值