javascript - js this 问题
PHP中文网
PHP中文网 2017-05-19 10:22:14
0
5
427
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) 结果 为什么不同吗?

PHP中文网
PHP中文网

认证0级讲师

全部回复(5)
世界只因有你

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 () {

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.

習慣沉默

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板