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?
var temp =foo.bar=foo.bar;
temp();
连等赋值
懂?
因为这样就不是作为对象方法调用而是作为函数调用,所以this指向undefined,非严格模式undefined又是指向全局。
this的定义都是由执行时的上下文,那自然就是谁调用,this就是谁
第(2)调用的是foo.bar那这个this就找到了foo对象了;
第(3)调用的时候先有一个赋值的行为,把foo.bar赋值给了foo.bar,这样一来就变成了全局变量了。全局调用这个函数,所以它指向的当然是undefined了(浏览器环境下非严格模式)。
从代码注释上看,题主可能只是不明白(3),这里解释下:
foo.bar = foo.bar
表达式返回的是匿名函数,即function() {alert(this);}
。所以再调用相当于该匿名函数的自调用,即
(function() {alert(this);})();
。补充下:
(foo.bar)
表达式返回小括号里的,即foo.bar
。然后foo.bar
作为函数被调用,即foo.bar()
。而赋值表达式是将右侧的即
foo
对象的bar
存的值赋值给左侧并返回。var foo = {
bar: function () {
}
};
(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.
赋值表达式返回了全局=》window
foo.bar被赋值了function(){alert(this)} this在全局指向window