var foo = { bar: function () { alert(this); } }; foo.bar(); // Reference, OK => foo (1) (foo.bar)(); // Reference, OK => foo (2) (foo.bar = foo.bar)(); // global? (3)
可以解释下 这(2)和(3) 结果 为什么不同吗?
认证0级讲师
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);}。foo.bar = foo.bar表达式返回的是匿名函数,即function() {alert(this);}。所以再调用相当于该匿名函数的自调用,即(function() {alert(this);})();所以再调用相当于该匿名函数的自调用,即(function() {alert(this);})();。
foo.bar = foo.bar
function() {alert(this);}
(function() {alert(this);})();
补充下:(foo.bar)表达式返回小括号里的,即foo.bar。然后foo.bar作为函数被调用,即foo.bar()。(foo.bar)表达式返回小括号里的,即foo.bar。然后foo.bar作为函数被调用,即foo.bar()。而赋值表达式是将右侧的即foo对象的bar而赋值表达式是将右侧的即foo对象的bar存的值赋值给左侧并返回。
(foo.bar)
foo.bar
foo.bar()
foo
bar
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.
赋值表达式返回了全局=》windowfoo.bar被赋值了function(){alert(this)} this在全局指向window
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);}
。foo.bar = foo.bar
表达式返回的是匿名函数,即function() {alert(this);}
。所以再调用相当于该匿名函数的自调用,即
(function() {alert(this);})();
所以再调用相当于该匿名函数的自调用,即(function() {alert(this);})();
。补充下:
(foo.bar)
表达式返回小括号里的,即foo.bar
。然后foo.bar
作为函数被调用,即foo.bar()
。(foo.bar)
表达式返回小括号里的,即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