Heim > Fragen und Antworten > Hauptteil
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?
世界只因有你2017-05-19 10:24:14
var temp =foo.bar=foo.bar;
temp();
连等赋值
懂?
因为这样就不是作为对象方法调用而是作为函数调用,所以this指向undefined,非严格模式undefined又是指向全局。
世界只因有你2017-05-19 10:24:14
this的定义都是由执行时的上下文,那自然就是谁调用,this就是谁
第(2)调用的是foo.bar那这个this就找到了foo对象了;
第(3)调用的时候先有一个赋值的行为,把foo.bar赋值给了foo.bar,这样一来就变成了全局变量了。全局调用这个函数,所以它指向的当然是undefined了(浏览器环境下非严格模式)。
大家讲道理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
存的值赋值给左侧并返回。
曾经蜡笔没有小新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.