js函數調用方式大概可分為:函數調用,構造器調用,call或apply,方法調用四種方式。下麵結合一些基礎概念和實測代碼,從函數調用的角度,探討JavaScript中this的用法。 1. new對函數調用的影響 先看JScript手冊中對new和構造函數的解釋: 實測: 結論:構造器方式this指 ...
js函數調用方式大概可分為:函數調用,構造器調用,call或apply,方法調用四種方式。下麵結合一些基礎概念和實測代碼,從函數調用的角度,探討JavaScript中this的用法。
1. new對函數調用的影響
先看JScript手冊中對new和構造函數的解釋:
實測:
function Fun1(){ console.log(this); } new Fun1();//構造器調用方式 Fun1();//函數調用方式
window.Fun1();
結論:構造器方式this指向函數本身;函數調用方式,this指向全局對象window。Fun1()是window.Fun1()的簡寫,Fun1()是window的方法。
2.使用call或apply
JScript手冊的解釋:
實測:
function Fun1(x){ console.log(x,this); } function Fun2(x){ console.log(x,this); } Fun1.call(window,0); Fun1.call(Fun2(1),11); Fun1.call(new Fun2(2),22);
Fun1.apply(window,[3]);
結論:
通過call或apply調用函數,被調用的函數的this指向第一個參數指向的this。
apply和call作用相同,但參數上有區別。apply的第二個參數可以傳入一個函數的arguments對象。
3.方法調用模式
調用形式如:對象名.方法名()的函數調用模式。比如實例中的a.f(5)。
實測:(四種調用都在了)
function Fun1(x){ console.log(x,this); } function Fun2(x,y){ Fun3.apply(this, arguments);//apply和arguments結合使用 return{ f:Fun1 }; } function Fun3(x,y){ console.log(x,y,this); } var a = Fun2(1,2); var b = new Fun2(3,4); a.f(5); b.f(6);
此例中,函數Fun2返回了一個對象{f:Fun1},所以a,b都指向了該對象,進而Fun1中的this指向對象{f:Fun1}。
結論:方法調用模式下,this指向方法所屬的對象。
總結:this指向的對象是在函數調用的時候決定的,通過函數調用方式,可以推斷出this。
現在回過頭來看一下,在JScript手冊中,this語句的解析如下:
嗯,對上面的解釋基本沒有疑惑。附上手冊