为什么当我尝试将函数绑定到自身时,“this”对象仍然引用窗口?

时间:2012-08-08 17:46:20

标签: javascript

var a = function() {

  alert( this ); // [object Window]
  alert(  a   ); // undefined

}.call( a );

为什么this仍然引用窗口对象而a未定义。或者,当我按以下方式执行时,this等于函数a未定义。

var a = function() {

  return this === a; // true

};

a.call(a);

有谁可以解释为什么看似等效的这两个函数会产生不同的结果?

4 个答案:

答案 0 :(得分:5)

因为在您的第一个示例中,在您的函数调用完成之后才会分配a

详细地说,这是第一个例子中发生的事情:

  1. 定义了匿名函数。
  2. 使用a作为this参数调用该函数。
  3. 该函数会执行,但由于a仍然未定义,this会重新回到window
  4. 该函数返回undefined,分配给a

答案 1 :(得分:3)

var a = function() {

  alert( this ); // [object Window]
  alert(  a   ); // undefined

}.call( a );

a这里成为评估函数的结果:即a = (function() { ... }).call(a),而不是函数本身。

答案 2 :(得分:0)

在第一个示例中,在调用函数之前不会分配a,因此a未定义。

答案 3 :(得分:-2)

尝试这样,

var a = function() {...}
a.call(a)