0.apply偎捎、call 有什么作用蠢终,什么區(qū)別
- apply方法是指定this和參數(shù)的情況下調用某個函數(shù)
- call方法是使用一個指定的this和若干個指定參數(shù)的前提下調用某個函數(shù)或方法
- 主要區(qū)別在于call是接受this和若干個參數(shù)的列表而apply則是接受一個包含多個參數(shù)的數(shù)組
1.以下代碼輸出什么?
<pre>
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")}
john.sayHi = func
john.sayHi()
</pre>
輸出下圖,因為這里是john在調用func鸭限,所以this的環(huán)境是john蜕径,所以他的this.firstname也就是john
2.下面代碼輸出什么,為什么
<pre>
func()
function func() { alert(this)}
</pre>
輸出window败京,因為是在全局下調用的函數(shù)兜喻,所以環(huán)境就是window本身
3.下面代碼輸出什么,為什么
<pre>
function fn0(){
function fn(){
console.log(this); }
fn();}
fn0();
document.addEventListener('click', function(e){
console.log(this);
setTimeout(function(){
console.log(this); }, 200);}, false);
</pre>
第一個fn0調用輸出的是window赡麦,因為這里是在全局環(huán)境下調用的函數(shù)朴皆,所以this指代環(huán)境window。
每次單擊之后泛粹,輸出的是document和window遂铡,因為第一個this就是在監(jiān)聽事件內發(fā)生的,所以輸出的this環(huán)境是document晶姊,第二個輸出window是因為兩個定時器函數(shù)比較特殊扒接,是固定輸出window的。
4.下面代碼輸出什么
<pre>
var john = {
firstName: "John" }
function func() {
alert( this.firstName )}
func.call(john)
</pre>
輸出john们衙,因為使用call函數(shù)把this綁定到了john上钾怔,所以輸出john
5.下面代碼輸出什么
<pre>
var john = {
firstName: "John",
surname: "Smith"}
function func(a, b) {
alert( this[a] + ' ' + this[b] )}
func.call(john, 'firstName', 'surname')
</pre>
輸出John smith,因為call的第一個參數(shù)相當于this蒙挑,后兩個參數(shù)相當于func的參數(shù)
6.下面代碼有什么問題
<pre>
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指什么
this.showMsg(); }) },
showMsg: function(){
console.log('饑人谷'); }}
</pre>
第一個this指代$btn宗侦,第二個也是指代btn然而btn沒有showMsg這個方法,所以應該在函數(shù)最開始聲明