suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Javascript - js diese Frage

var foo = {
  bar: function () {
    alert(this);
  }
};
 
foo.bar(); // Reference, OK => foo      (1)
(foo.bar)(); // Reference, OK => foo    (2)
 
(foo.bar = foo.bar)(); // global?       (3)

Können Sie erklären, warum die Ergebnisse von (2) und (3) unterschiedlich sind?

PHP中文网PHP中文网2814 Tage vor430

Antworte allen(5)Ich werde antworten

  • 世界只因有你

    世界只因有你2017-05-19 10:24:14

    var temp =foo.bar=foo.bar;
    temp();
    连等赋值
    懂?
    因为这样就不是作为对象方法调用而是作为函数调用,所以this指向undefined,非严格模式undefined又是指向全局。

    Antwort
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:24:14

    this的定义都是由执行时的上下文,那自然就是谁调用,this就是谁

    第(2)调用的是foo.bar那这个this就找到了foo对象了;

    第(3)调用的时候先有一个赋值的行为,把foo.bar赋值给了foo.bar,这样一来就变成了全局变量了。全局调用这个函数,所以它指向的当然是undefined了(浏览器环境下非严格模式)。

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-05-19 10:24:14

    从代码注释上看,题主可能只是不明白(3),这里解释下:
    foo.bar = foo.bar表达式返回的是匿名函数,即function() {alert(this);}
    所以再调用相当于该匿名函数的自调用,即(function() {alert(this);})();

    补充下:
    (foo.bar)表达式返回小括号里的,即foo.bar。然后foo.bar作为函数被调用,即foo.bar()
    而赋值表达式是将右侧的即foo对象的bar存的值赋值给左侧并返回。

    Antwort
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-19 10:24:14

    var foo = {
    bar: function () {

    alert(this);

    }
    };
    (foo.bar)(); // Reference, OK => foo (2)
    注:这里的(foo.bar)()就相当于第一个foo.bar(),执行的是foo对象里的bar方法,this指向的就是foo对象
    (foo.bar = foo.bar)(); // global? (3)
    注:首先看foo.bar = foo.bar,foo.bar是function () {alert(this);}赋值给了foo.bar,
    那么(foo.bar = foo.bar)就等于 (function(){alert(this)}),那么加上外面的()就是即时函数:
    (function(){alert(this)})();所以这里的是指向的就是全局window.

    Antwort
    0
  • 習慣沉默

    習慣沉默2017-05-19 10:24:14

    赋值表达式返回了全局=》window
    foo.bar被赋值了function(){alert(this)} this在全局指向window

    Antwort
    0
  • StornierenAntwort