函数进阶

函数的调用方式

  • 普通函数
  • 构造函数
  • 对象方法

函数内this指向的不同场景

函数的调用方式决定了this指向的不同:

调用方式 非严格模式 备注
普通函数调用 window 严格模式下是 undefined
构造函数调用 实例对象 原型方法中 this 也是实例对象
对象方法调用 该方法所属对象 紧挨着的对象
事件绑定方法 绑定事件对象
定时器函数 window

call、apply、bind
JavaScript 为我们专门提供了一些函数方法用来帮我们更优雅的处理函数内部 this 指向问题。
call

call()方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。
注意:该方法的作用和 `apply()` 方法类似,只有一个区别,就是 `call()` 方法接受的是若干个参数的列表,而 `apply()` 方法接受的是一个包含多个参数的数组。
语法:

fun.call(thisArg[, arg1[, arg2[, ...]]])
参数:

thisArg:    在 fun 函数运行时指定的 this 值
                如果指定了 null 或者 undefined 则内部 this 指向 window
arg1, arg2, ...:   指定的参数列表

apply

apply()方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。
fun.apply(thisArg, [argsArray])
apply()与call()非常相似,不同之处在于提供参数的方式。
 apply()使用参数数组而不是一组参数列表。

bind

bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体(在 ECMAScript 5 规范中内置的call属性)。
当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。 
一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。
fun.bind(thisArg[, arg1[, arg2[, ...]]])
参数:

thisArg
当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用new 操作符调用绑定函数时,该参数无效。
arg1, arg2, ...
当绑定函数被调用时,这些参数将置于实参之前传递给被绑定的方法。

高阶函数

  • 函数可以作为参数
function eat (callback) {
	setTimeout(function () {
		console.log('吃完了')
		callback()
	}, 1000)
}

eat(function () {
   console.log('去ktv')
})
  • 函数可以作为返回值
function genFun (type) {
	return function (obj) {
	   return Object.prototype.toString.call(obj) === type
	}
}

var isArray = genFun('[object Array]')
var isObject = genFun('[object Object]')

console.log(isArray([])) // =>true
console.log(isArray({})) // =>true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值