問答
1谴供、apply结闸、call 有什么作用,什么區(qū)別
apply和call的
作用:都是為了改變函數(shù)內部的this指向
區(qū)別:fn.call(this,arg1,arg2,arg3......)
fn.apply(this,argumentsArray)
call是單個單個傳入的聂抢,apply是用數(shù)組Array的形式傳入的參數(shù)。
代碼
1棠众、以下代碼輸出什么?
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()
alert
這里
john.sayHi = func
意味著讓window調用了這個函數(shù)對象琳疏,然后執(zhí)行john.sayHi()
自然可以取到var john = { firstName: "John" }
所定義的參數(shù)了。
2闸拿、下面代碼輸出什么空盼,為什么
func()
function func() {
alert(this)
}
object-window.png
因為這是window調用的函數(shù)func,所以對象是window
3新荤、下面代碼輸出什么
function fn0(){
function fn(){
console.log(this);//window
}
fn();
}
fn0();//這里由全局調用函數(shù)揽趾,所以this是window
document.addEventListener('click', function(e){
console.log(this);//document,這里的this指向的就是addEventListener的對象苛骨,也就是document
setTimeout(function(){
console.log(this);//window
}, 200);
}, false);
setTimeout篱瞎、setInterval這兩個方法執(zhí)行函數(shù)對象調用的一定是全局對象
win-doc-win.png
4、下面代碼輸出什么痒芝,why
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)
用了.call()的方法俐筋,括號內傳入的就是this,這里指定了是Jhon严衬,所以alert的結果是Jhon
Jhon.png
5澄者、代碼輸出?
var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')
涉及到.call(this,argument1,argument2,...)的使用请琳,這里傳入對象this是john
,然后參數(shù)分別是firstName
和surname
Jhon Smith.png
6粱挡、以下代碼有什么問題,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指什么俄精,這里this就是指觸發(fā)事件的本身$btn
this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
修改之后
<body>
<div id="btn">aaa</div>
<script>
var $btn = $('#btn');
var module = {
bind: function () {
var _this = this; //這里是關鍵保存住window的this
$btn.on('click', function () {
console.log(this);
_this.showMsg();//這里用了window.this
})
},
showMsg: function () {
console.log('饑人谷');//這里如果用$btn的this將無法調用
}
}
module.bind();
</script>
</body>
呃...this gonna be happend