函数的定义方式
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.log(f); // 3
改变函数内部this 指向
JavaScript 为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部 this 的指向问题,常用的有bind().call()、apply()三种方法。
call():可以调用某个函数,并且修改函数运行时的this指向
语法:
fun.call (thisArg, arg1, arg2, ...)
thisArg:当前调用函数this的指向对象;
arg1,arg2:传递的其他参数;
借用构造函数继承父类型属性
核心原理:通过call()把父类型的this指向子类型的this,这样就可以实现子类型继承父类型的属性
apply方法
apply0方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的this指向。
fun.apply(thisArg,[argsArray])
thisArg :在fun函数运行时指定的this值;
argsArray :传递的值,必须包含在数组(伪数组)里面;
返回值 就是函数的返回值,因为它就是调用函数
主要应用:可以利用apply借助数学内置对象求取最大值
bind方法
bind()方法不会调用函数。但是能改变函数内部this指向
fun. bind (thisArg, arg1, arg2, ...)
thisArg :在fun函数运行时指定的this值
arg1 , arg2:传递的其他参数
返回由指定的this值和初始化参数改造的原函数拷贝
**主要应用:**如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind
(例如:有一个按钮,当我们点击了之后,就禁用这个按钮,3秒钟之后开启这个按钮)
<button></button>
var btn = document.querySelector('button');
btn.onclick = function() {
this.disabled = true; // 这个this 指向的是btn 这个按钮
// var that = this ;
setTimeout (function() {
// that.disabled = false; // 定时器函数里面的this 指向的是window
this.disabled = false; // 定时器函数里面的this指向的是window
}.bind(this), 3000); // 这个this指向的是btn这个对象
call apply bind 总结
相同点:
都可以改变函数内部的this指向;
区别点:
- call和 apply会调用函数并且改变函数内部this指向;
- call 和apply传递的参数不一样cll传递参数aru1, aru2形式apply 必须数组形式[arg];
- bind 不会调用函数可以改变函数内部this指向。
主要应用场景:
- call 经常做继承;
- apply经常跟数组有关系 比如借助于数学对象实现数组最大值最小值;
- bind 不调用函数但是还想改变this指向比如改变定时器内部的this指向.。