var name = '小怪兽社区'
var web = {
name: '芋圆社区',
}
function getWeb() {
console.log(this.name)
}
getWeb() // '小怪兽社区',全局对象 window里name变量
// 可以通过call和apply更改this的指向,获取web对象下的name
getWeb.call(web) // '芋圆社区'
getWeb.apply(web) // '芋圆社区'
var name = '小怪兽社区'
var web = {
name: '芋圆社区',
}
function getWeb(num1, num2) {
console.log(this.name)
console.log(num1)
console.log(num2)
}
getWeb(1, 3) // '小怪兽社区' 1 3
getWeb.call(null, 1, 3) // '小怪兽社区' 1 3
getWeb.call(web, 1, 3) // '芋圆社区' 1 3
getWeb.apply(null, [1, 3]) // '小怪兽社区' 1 3
getWeb.apply(web, [1, 3]) // '芋圆社区' 1 3
// 指向全局变量window
getWeb.call(null)
// 接收到的参数是1, 2, 3
getWeb.call(obj, 1, 2, 3)
// 指向全局变量window
getWeb.apply(null)
// 只接受到了参数1, 2
getWeb.apply(obj, [1, 2], 3)
// 类数组,接受到的参数实际上是 1,2,3
func.apply(obj, {
0: 1,
1: 2,
2: 3,
length: 3,
})
// Math.max取最大值
Math.max(14, 3, 77);
// ES5 的写法
Math.max.apply(null, [14, 3, 77])
// ES6 的写法
Math.max(...[14, 3, 77])
Function.prototype.myCall = function(context) {
context = context || window
context.fn = this
let args = []
for (let i = 1; i < arguments.length; i++) {
args.push(`arguments[${i}]`)
}
// eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
let result = eval(`context.fn(${args})`)
delete context.fn
return result
}
Function.prototype.myApply = function(context, arr) {
context = context || window
context.fn = this
let result
if (!arr) {
result = context.fn()
} else {
let args = []
for (let i = 0; i < arr.length; i++) {
args.push(`arr[${i}]`)
}
result = eval(`context.fn(${args})`)
}
delete context.dn
return result
}
let obj = {
name: '小白',
}
function getName() {
console.log(this.name)
}
// bind返回了一个函数
let bindFn = getName.bind(obj)
bindFn() // '小白'
let obj = {
name: '芋圆社区',
}
function getValue(num1, num2) {
console.log(this.name)
console.log(num1)
console.log(num2)
}
let bindFn = getValue.bind(obj, 1)
bindFn(5) // '芋圆社区' 1 5
Function.prototype.myBind = function(context) {
let self = this
// 获取myBind函数从第2个参数之后的参数(包含第二个参数)
let args = Array.prototype.slice.call(arguments, 1)
let result_f = function() {
// 此时的arguments是指的myBind函数返回的函数传入的参数
let bindArgs = Array.prototype.slice.call(arguments)
// 当作为构造函数时,this指向实例
// 当作为普通函数时,this指向window,将绑定函数的this指向context
return self.apply(this instanceof result_f ? this : context, args.concat(bindArgs))
}
// 修改返回函数的prototype为绑定函数的prototype
// 下面三行的实现等同于 result_f.prototype = Object.create(this.prototype)
let temp_f = function() {}
temp_f.prototype = this.prototype
result_f.prototype = new temp_f()
return result_f
}
此页面不支持夜间模式!
已进入夜间模式!
已进入普通模式!
搜索框不允许为空
签到成功!经验+5!芋圆币+2!
签到失败!今日已签到!
需要登录社区账号才可以进入!