JavaScript中的this到底是什么?

上一篇 / 下一篇  2012-08-24 09:14:24 / 个人分类:Java

51Testing软件测试网v9AI%c]:P I3L-\

  对于常年使用C++,C#,Java等这些面向对象语言的程序员来说,几乎天天都和this打交道。在这些语言里,this含义非常明确,就是 指向当前的对象实例,我们用起来也是相当的放心。然而,到了JavaScript这个动态语言里,this的写法没变,但是其含义却大大地不同了,下面用 实例说明,使用浏览器为Firefox14.0.1.51Testing软件测试网Zr zqa%D2WJS G

51Testing软件测试网(Xk7j;^U7hc7l

  例子一:51Testing软件测试网\}4ag'?V S~-a

s0n rHB8\ s ~k0  (1)源码51Testing软件测试网-Qy&t H+rhR`

<!DOCTYPE html>51Testing软件测试网Vm5Apgu
<html>51Testing软件测试网mYXc+H!Y)A
<body>
~9r{6A|/lS6o*^~W0 <script>
_5C9@8`*qhB0  alert(this);
.Y }4k \W1s)Ue*Q8i M0 </script>
(L;V X6LC^0</body>51Testing软件测试网 T0k BT0d&g:|
</html>
51Testing软件测试网$A4R)RT:[ F1h

  (2)执行结果

8E*z9xj(q0

51Testing软件测试网*z`%e+W'LT ?4E

  (3)分析与结论

#]X4YM x O;r0

  此时,JS引擎会自动生成一个window对象的成员函数,把上述执行代码放入此函数执行,此时this指向对象window。此时与C++,JAVA,C#的实例成员函数类似。

*stT ykK ?`6Qc0

  例子二:51Testing软件测试网Q~;iA@'F5} T!\

  (1)源码

+|+r-cH(?1}0
<!DOCTYPE html>
/h-F9Tl7R N }0<html>51Testing软件测试网 yf)b%XK5s,^
<body>
zF:L\h {rn7J {J0 <script>
Mw;Kwq0  function f() {51Testing软件测试网A8r ^}&c7T
   alert(this);51Testing软件测试网rf0@:z)C/p
  }51Testing软件测试网u7\(F~;pF*Q'y
  f();
e&K UY Iz.y0 </script>51Testing软件测试网,f/`|3_2]
</body>51Testing软件测试网`!\&_,V-Uc.U(}
</html>

,q[6zTqw/W%v r3b |0  (2)执行结果

n,?y {.y'^C,J0

p*`~!R*fh0I0

  (3)分析与结论

#LgGW-`0

  此例本质上与例子一相同,其中f();其实等价于window.f();也是通过window对象去调用成员函数,此时this仍指向window对象。此时与C++,JAVA,C#的实例成员函数类似。51Testing软件测试网#W:o-Fd.dp!k

&^\T(}tcO0  例子三:

l1X)@3?W(l:L%Q Y051Testing软件测试网 k3z s:?}(b_

  (1)源码

U.RW_Q051Testing软件测试网9hf!r eIb {XZ NU

)aIy8no!f~0
<!DOCTYPE html>
,x![ |,` z"]0<html>51Testing软件测试网OtOGOD5F/]
<body>51Testing软件测试网Qc+O mq)i?
 <script>
X(C#Xj II0  function f(name) {
;Nt8fj$OV;Nq0   this.name = name;
2Ce0E-x Q)I}]`G P%\^0  }51Testing软件测试网 r^l N|wCx
  var a = new f('叶诗文');51Testing软件测试网 YG@9g a
  alert(a.name);51Testing软件测试网'Z U1v^'Mbz
 </script>51Testing软件测试网^:Q'@-c @
</body>51Testing软件测试网 vc7B~V}2V i.h
</html>

2X8D1gIq7Y1n0  (2)执行结果51Testing软件测试网4ZP i0^[U2E(^

qO*t~l3N0

  (3)分析与结论51Testing软件测试网9K W6} h3ZtwJ

  此时,f()被当做构造函数来执行,函数体内的this此时指向被新构造出来的对象a。此时,与C++,JAVA,C#的构造函数类似。51Testing软件测试网D5^NWs Rx&P

  例子四:

!QJ1H#Ub(C~0

  (1)源码51Testing软件测试网gr4ZQ~QM

9g(H@~l\8j g0
<!DOCTYPE html>
\8OY+P;uw!pz0<html>
DK$_dKm0<body>51Testing软件测试网[gmG(x)Nh@8m
 <script>51Testing软件测试网?.|l ~%Kv1R
  function f() {
[c-a7pHFR:R-e0   alert(this.name);51Testing软件测试网s fh t z1L6g8\2]
  }51Testing软件测试网!D{V.T5v
  f.apply({name: '叶诗文'});
R+aM/E-I5]b D2q0 </script>51Testing软件测试网GhzG ]
</body>51Testing软件测试网:^o],I a3KiAG
</html>
51Testing软件测试网5a O,`Z5t'Sw

  (2)执行结果

Lb0s Owy0

.Hc6] u*`Y;v0

  (3)分析与结论51Testing软件测试网%Z,Q0C9Pf&[Je

  通过apply方式调用时,函数内的this是通过参数控制的,apply()的第一个参数就指定了this的值。在C++,JAVA,C#中不存在这种特性。

#i7} ?z CW5Ip@ Q2s0

$O.dPPwI0  例子五:51Testing软件测试网b@Qh(c

51Testing软件测试网(U&wf-x)j2?6Ff

  (1)源码51Testing软件测试网 RD A-Ns$djc4x

0z6n:j$Gy&qI0

pof |,B,JL7E0
<!DOCTYPE html>51Testing软件测试网0B+OM#JvQ
<html>
6D$]p5]%wl9v0<body>
5RJYe z U"Po N0 <script>
K(D,R3R7FS+JNn0  var name = '刘翔';51Testing软件测试网0F2s3N9f7n d6EA%M
  var a = {name: '叶诗文'};51Testing软件测试网!pA ld*e
  a.f = function() {
x|)oa;N6h/T9CG GQ0   alert(this.name);51Testing软件测试网f.H fS(G8C@%g c.d fR
   (function(){
!^ IQO)f|@3y0    alert(this.name);51Testing软件测试网!k@CN4f+lm
   })();51Testing软件测试网M@u`3Sb9p)YD}
  }51Testing软件测试网cD%aX|{-ne
  a.f();51Testing软件测试网X2ug6q6c/La
 </script>
"X l~LY5D"r7qR0</body>
&bA6~|x.BR wN0</html>

W:f-`/`1D s0  (2)执行结果

w&Dx.O-G0

    51Testing软件测试网6v'I&hf IB

  (3)分析与结论51Testing软件测试网Ek*h'u`%i4\g*JP

  此处的f()函数是作为对象a的成员函数来执行的,所以f函数体内的this指向对象a;而其中嵌套的匿名函数没有显示指定其所属对象,则自动属于window对象,其执行是作为window的成员函数来执行,故其函数体内的this指向window。51Testing软件测试网'v p6C(H7Z,s

  总结:51Testing软件测试网%V be7_'\n&l*L/hm

  (1)JavaScript中,执行代码必须放入函数中,如果没有显示写入函数中,则代码会自动被放入window的某个成员函数中;

?sl)Rg[,{7|0

  (2)JavaScript的函数都是成员函数,一定属于某个对象,如果没有显示指定此对象,那么这个函数就属于window对象;

lc\ p YA0

  (3)JavaScript函数的执行方式有三种,一是作为成员函数来调用,此时函数体内的this指向函数所属对 象;二是作为构造函数来调用,此时函数体内的this指向通过此构造函数新创建的对象;三是通过apply或call调用,此时函数体内的this是被参 数控制的。

1]d t@ Su7}5~)L:~0

  (4)this的指向与定义函数的语法与位置无关,只与函数被调用的方式有关。51Testing软件测试网 y2h#})nyqi%C[


TAG:

 

评分:0

我来说两句

Open Toolbar