1.函数的定义方式
1.函数声明式(命名函数)
function fn(){}
2.函数表达式(匿名函数)
var fn = function(){}
3.new Function()
var fn = new Function('参数1','参数2',...'函数体')
举个🌰: var f = new Function('a','b','console.log(a+b)')
f(1+2)
注意:
1.Function里面的参数都必须是字符串形式
2.第三种执行效率第,不方便书写
3.所有的函数都是Function的实力对象
4.函数也属于对象
2.函数的调用
2.1.普通函数
function fn (){
console.log('哈哈')
}
fn() //调用
2.2.对象的方法
let o = {
sayHa:function(){
console.log('哈哈')
}
}
o.sayHa() //调用
2.3.构造函数
function Star(){}
new Star 调用
2.4.绑定事件函数
btn.onclick = function(){}
点击按钮调用
2.5.定时器函数
SetInterval(function(){},1000)
每秒调用1次
2.6.立即执行函数
(function(){console.log('哈哈')})()
自己调用
3.this
3.1.函数内部的this指向
this的指向是调用函数的时候确定的。调用方式的不同决定了this的指向不同,一般指向我们的调用者。
调用方式 | this指向 |
---|---|
普通函数调用 | window prototype |
构造函数调用 | 实例对象,原型对象里的方法也指向实例对象 |
对象方法调用 | 该方法所属的对象 |
事件绑定调用 | 绑定/触发事件的对象 |
定时器函数 | window |
立即执行函数 | window |
3.2.改变函数内部this指向
3.2.1.call方法
1.可以调用函数,也可以改变this指向
应用场景:做继承
let o = {name : 'dai'}
function fn (a,b){
console.log(this)
console.log(a+b)
}
fn(1,2) //window,3
fn.call(o,2,3) //对象o, 5
3.2.2.apply方法
1.可以调用函数,也可以改变this指向
应用场景:经常跟数组有关
let o = {name : 'dai'}
function fn(a,b){
console.log(this)
console.log(a+b)
}
fn(1,2) window 3
fn.apply(o,[1,2]) 对象o 3
举个🌰:
let arr = [1,2,3]
Math.max.apply(Math,arr) 3
3.2.3.bind方法
1.不会调用函数,但是能改变this指向
返回的是原函数改变this之后产生的新函数
应用场景:不调用函数,还想改变this指向
let o = {name:'dai'}
function fn (a,b){
console.log(this)
console.log(a+b)
}
let f = fn.bind(0,1,2) 此处f是bind返回的新函数
f() 对象o 3
3.2.4.call,apply,bind三者的异同
-- 共同点:都可以改变this指向
-- 不同点:
call 和 apply 会调用函数,并改变this指向
call 和 apply 传参方式不同,call 传参用逗号隔开,apply 传递数组
bind不会调用函数,但改变this指向
-- 应用场景:
1.call经常做继承
2.apply经常跟数组有关系,借于数字对象实现数组最大,最小值。
3.bind不调用函数,但是改变this指向,比如改变定时器内部的this指向。