0.apply、call 有什么作用,什么區別
- apply方法是指定this和參數的情況下調用某個函數
- call方法是使用一個指定的this和若干個指定參數的前提下調用某個函數或方法
- 主要區別在于call是接受this和若干個參數的列表而apply則是接受一個包含多個參數的數組
1.以下代碼輸出什么?
<pre>
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")}
john.sayHi = func
john.sayHi()
</pre>
輸出下圖,因為這里是john在調用func,所以this的環境是john,所以他的this.firstname也就是john
2.下面代碼輸出什么,為什么
<pre>
func()
function func() { alert(this)}
</pre>
輸出window,因為是在全局下調用的函數,所以環境就是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,因為這里是在全局環境下調用的函數,所以this指代環境window。
每次單擊之后,輸出的是document和window,因為第一個this就是在監聽事件內發生的,所以輸出的this環境是document,第二個輸出window是因為兩個定時器函數比較特殊,是固定輸出window的。
4.下面代碼輸出什么
<pre>
var john = {
firstName: "John" }
function func() {
alert( this.firstName )}
func.call(john)
</pre>
輸出john,因為使用call函數把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的第一個參數相當于this,后兩個參數相當于func的參數
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這個方法,所以應該在函數最開始聲明