1、apply、call、bind有什么作用,什么區別?
- bind
Function.prototype.bind()作為內建對象Function原型的的一個方法,bind()方法創建一個新的函數,當被調用的時候,其this關鍵字設置為提供者的值,調用新函數時,在任何提供之前提供一個給定的參數序列。
語法:fun.bind(thisArg[,arg1,aeg2...])
demo
this.x = 9 //window.x =9
var module = {
x:81,
getX: function(){
console.log(this.x);
}
}
module.getX(); //返回81,this指向module對象
var retrieveX = module.getX
retrieveX(); //返回9,this指向全局作用域
//創建一個新的函數,將"this"綁定到module對象
var boundGetX = retrieveX.bind(module);
boundGetX(); //返回81,通過bind()方法改變this的指向
- call、 apply
call()方法的作用和apply()類似,只有一個區別,就是call()方法接受的是若干個參數的列表,而apply()方法接受的是一個包含多個參數的數組。
call()語法:fun.call(thisArg[, arg1[, arg2[, ...]]])
call-demo
//使用call方法調用匿名函數
var animals = [
{species:'Lion',name:'King'},
{species:'Whale',name:'Fail'}
]
for(var i=0;i<animals.length;i++){
(function(i){
this.print = function(){
console.log('#'+i+' '+this.species+ ' : ' + this.name)
}
this.print();
}).call(animals[i],i);
}
apply()語法:fun.apply(thisArg, [argsArray])
apply-demo
var numbers = [5,6,2,3,7,8]
var max = Math.max.apply(null,numbers)
var min = Math.min.apply(null,numbers)
console.log(max)
console.log(min)
2、
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() //John:hi!
3、
func() ; //Object window ,函數內的this在函數直接調用的時候在非嚴格模式下指向window
function func() {
alert(this)
}
4、
document.addEventListener('click', function(e){
console.log(this); //#document
setTimeout(function(){
console.log(this); //window
}, 200);
}, false);
5、
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john) //John,通過call將函數func的this綁定到了john對象上
6、以下代碼有什么問題,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指向$btn
this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
修改:
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //通過bind()方法將this綁定到module上
this.showMsg();
}).bind(module)
},
showMsg: function(){
console.log('饑人谷');
}
}