函数的定义方式
1.自定义函数(命名函数)
funtion fn(){};
2.函数表达式(匿名函数)
var fun = funtion fn(){};
3.使用new Funtion('p1', 'p2', '函数体')
//函数体用字符串的形式写入
var f = new Funtion('p1', 'p2', 'console.log(p1+p2)');
f(1, 2)
所有函数都是Funtion的一个实例(对象)
函数也是一种对象
函数的调用方式
1.普通函数
funtion fn(){ console.log('nihao')};
//调用
fn();
//或者
fn.call()
2.对象的方法
var x = {
sayHi:funtion(){
console.log('nihao');
}
}
//调用
x.sayHi();
3.构造函数
funtion Star(){};
//调用
new Star();
4.绑定事件函数
btn.onclick = function(){};
//点击按钮进行调用
5.定时器函数
setInterval(funtion(){}, 1000);
6.立即执行函数
(funtion(){
console.log('nihao');
})();
this的指向问题
this的指向是当我们调用函数的时候确定的,调用方式的不同决定了this的指向不同
调用方式 this指向
普通函数调用 window(普通函数是window调用的)
构造函数调用 实例对象,原型对象里面的方法也指向实例对象
对象方法调用 该方法所属对象
事件绑定方法 绑定事件的对象
定时器函数 window
立即执行函数 window
改变函数内部this的指向
JavaScript提供了一些函数方法帮我们更优雅的处理函数内部的this指向问题,常用的有bind()、call()、apply()三个方法
1.call方法
var t = {
name:'tom'
}
funtion fn(){
console.log(this);
}
fn.call() //这时候fn函数中的this指向window
fn.call(t) //这时fn函数中的this指向了t对象
这个特性可以用在继承中
funtion Father(uname , age){
this.uname = uname;
this.age = age;
}
funtion Son(uname, age){
//通过call函数将father中的this指向了son
//son继承了father的构造函数,拥有了uname和age这两个属性
Father.call(this, uname, age);
}
2.apply方法
apply()和call()作用一样(参数不同),可以调用一个函数,简单理解为调用函数的方式,但是它可以改变函数的this指向
fun.apply(thisArg, [argsArray]) (参数必须是数组(伪数组))
apply主要应用在数组方面
//数组中没有求最大最小值的方法,但是Math中有
//可以使用apply方法实现
var arr = [1, 2, 3, 4, 1];
var max = Math.max.apply(Math, arr);
var min = Math.max.apply(Math, arr);
console.log(max, min);
3.bind方法
bing()方法不会调用函数,但是可以改变函数内部this的指向
fun.bind(thisArg, arg1, arg2, ...)
返回原函数改造后的一个拷贝