函数(万物皆对象)
函数表达式
//1.函数声明方式function关键字(命名函数)
function fn(){};
//2.函数表达式(匿名函数)
var fun=function(){};
//3.利用new Function(‘参数1’,‘参数2’,‘函数题’);
var f=new Function('a','b','console.log(a+b)');
f(1,2);
console.dir(f);//可以显示一个对象所有的属性和方法
console.log(f instanceof Object);//判断前者属不属于后者,返回true
- Function里面参数都必须是字符串格式
- 第三种方法执行效率低,不方便书写
- 所有函数都是Function的实例(对象)
- 函数也属于对象
函数的调用
//1.普通函数
function fn(){
console.log('小楠楠爱前端‘);
}
fn();fn.call()//调用
//2.对象的方法
var o={
sayHi:function(){
console.log('');
}}
o.sayHi();
//3.构造函数
function Star(){};
new Star();
//4.绑定函数事件
btn.onclick=function(){};
//5.定时器函数
setInterval(function(){},1000);//这个函数定时器自动一秒钟调用一次
window.steTimeout(function(){
console.log(‘定时器的this:’+this);
},1000);
//6.立即执行函数
(function(){
console.log('');
})()//立即执行就是会自动地调用
函数内this的指向
调用方式 | this指向 |
---|---|
普通函数调用 | window |
构造函数调用 | 实例对象,原型对象里面的方法也指向实例对象 |
对象方法调用 | 该方法所属对象 |
事件绑定方法 | 绑定事件对象 |
定时器函数 | window |
立即执行函数 | window |
改变函数内部this指向
①call()
call可以调用函数;改变函数内的this指向
- 主要作用是可以实现继承
var o={
name:'nn"}
function fn(a,b){
console.log(a+b);
};
fn.call(o,1,2);
//实现继承
function Father(uname,age,sex){
this.uname=uname;
this,age=age;
}
function Son(uname,age,sex){
Father.call(this,uname,age,sex);//把father里面的this给Son,实现继承
}
var son=new Son('','','',);
②apply()
- apply方法调用一个函数,简单理解为调用函数的方式,但是它可以改变函数的this指向
- fun,apply(thisArg,[argArray])
- thisArg:在fun函数运行的时候指定的this值
- argArray:传递的值,必须包含在数组里面
- 返回值就是函数的返回值,因为它就是调用函数
var o={ name:'nannan'; }; function(){ console.log(this); console.log(arr);//'pink' }; fn.apply(o,[‘pink’]);//把函数内部的指向o;
注意
- 它的参数必须是一个数组,(伪数组)
- apply()的主要应用,你比如说可以利用apply借助于数学内置对象求最大值Math.max();
``
var arr =[1,2,3,4,5,6,8]
var max=Math.max.apply(Math,arr);
console.log(max);
③bind()捆绑,绑定
bind()方法不会调用函数,但是能改变函数内部this的指向
fun.bind(thisArg,arg1,arg2。。)
- thisArg:在fun函数执行时指定的this值;
- arg1,arg2:传递的其它参数;
- 返回由指定的this值和初始化参数改造的原函数拷贝
var o={ name:'andy' }; function fn(a,b){ console.log(this);//普通函数的this指向的是window console.log(a+b); }; var f=fn.bind(o,1,2); f();
- 1.不会调用原来的函数,**可以改变原来函数内部的this的指向。**因为不会调用所以返回的是一个新的函数
- 2.返回的是原函数改变this之后产生的新函数
- 3.如果有的函数我们不需要马上调用,但是又想要改变函数内部的this指向时用bind;
- 4.举个栗子:我们有一个按钮,当我们点击了之后,就禁用这个按钮三秒后重新开启;
//原来的写法
var btn = document.querrySelector('button');
btn.onclick = function() {
this.disabled = true;//这个this指向的是btn
var that = this;
setTimeOut(function) {
that.disabled=false;定时器函数里面的this指向的是window
},3000);
}
//现在的写法同时绑定多个按钮
var btns = document.querrySelectorAll('button')';
btn.onclick = function() {
for (var i=0; i<btns.length; i++){
btns[i].onclick = function() {
this.disabledd = true;
setTimeput() {
this.disabled = fasle;//定时器里的this指向的btn
}.bind(this),3000);//这个bind写在了定时器的外面,而这个定时器函数又绑定了bind的方法,这个this指向的是btn这个对象
}
}
总结
①区别点
- call和apply会调用函数,并且改变函数内部this的指向;
- call和apply传递的参数不一样,call传递参数aru1,aru2形式,apply必须数组形式【arg】
- bind不会调用函数,可以改变函数内部this的指向;
②主要应用场景
- call常用来做继承
- apply经常跟数组有关,比如借助数学对象实现数组最大最小值
- bind不调用函数,但是还是想改变this指向,比如指定定视器里的this指向