1. call, apply 有什么作用?有什么區(qū)別卒煞?
call和apply用來(lái)直接指定this的綁定對(duì)象痪宰;
區(qū)別是call直接傳入?yún)?shù),而apply傳入的是數(shù)組畔裕;
fn.call(context, p1, p2,...);
fn.apply(context, [p1,p2,...]);
代碼題:
1.以下代碼輸出是什么衣撬?
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()
- 顯示彈窗:John:hi!
2. 下面代碼輸出的是什么扮饶?為什么具练?
func()
function func() {
alert(this)
}
//window
- 返回
window
對(duì)象;因?yàn)椋?/li> - 聲明提前甜无,
func()
執(zhí)行命令alert(this)
; -
func()
運(yùn)行在全局作用域window
下扛点,故this
指向window
3. 下面代碼輸出什么?
function fn0() {
function fn() {
console.log(this);
}
fn();
}
fn0();
document.addEventListener('click', function(e) {
console.log(this);
setTimeout(function() {
console.log(this);
}, 200);
}, false);
// window
// document
// window
- fn0中的
this
指向全局作用域岂丘; -
document.addEventListener
中的this
指向document
; -
setTimeout
中的this
指向全局作用域陵究。
4. 下面代碼輸出什么?為什么奥帘?
var john = {
firstName: "John"
}
function func() {
alert(this.firstName)
}
func.call(john)
- 彈窗John
-
func.call(john)
使得func中this指向john
5. 下面代碼輸出什么铜邮,為什么?
var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert(this[a] + ' ' + this[b])
}
func.call(john, 'firstName', 'surname')
- 彈窗:John Smith
- 通過(guò)
call
方法將function
中的this
指向john
6. 以下代碼有什么問(wèn)題?如何修改松蒜?
var module = {
bind: function() {
$btn.on('click', function() {
console.log(this) //this指什么
this.showMsg();
})
},
showMsg: function() {
console.log('饑人谷');
}
}
- 事件綁定的回調(diào)函數(shù)中第一個(gè)this指向$btn扔茅,第二個(gè)應(yīng)該指向module,故需聲明一個(gè)變量給this賦值秸苗,如下:
var module = {
var _this = this;
bind: function() {
$btn.on('click', function() {
console.log(this) //this指什么
_this.showMsg();
})
},
showMsg: function() {
console.log('饑人谷');
}
}