源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

一个对于js this关键字的问题

  • 时间:2020-06-26 12:59 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:一个对于js this关键字的问题
所以拿出来与大家共勉: 先运行以下的js代码 <script> foo = {  'bar': function () {  alert(this);  },  'toString': function () {  return 'foo';  } }; foo.bar();//返回的是"foo" (foo.bar)();//返回的是"[object Window]" (foo.bar || null)();//返回的是"[object Window]" bar = foo.bar; bar();//返回的是"[object Window]" </script> 我对这里的代码的解释: foo.bar(); //打印foo //1. alert隐式调用toString方法,转型成字符串,在foo里重写了toString方法,因此为foo (foo.bar)();//打印foo //2. 这里的执行同上 (foo.bar || null)(); /* 3. 这里在IE6.0,Mozilla Firefox1.5.0.7和Opera9.0里有不同的效果,IE和Opera都是object,Mozilla的为foo 暂且不谈这几个的JS对||的解释方法,这与bar方法中的this还有和||运算符是有关的。经过||之后 这里的this已经不再为window了,this关键字的作用,如果按照C++的理解,应该为动态联编,而非静态联编,我们平常的例子中 <script> (function (){ this.div = document.createElement("div");div.innerHTML="never-online"; document.body.appendChild(div);  this.div.onclick = function(){  alert(this.tagName);//这里的this就是div而非匿名函数中的this  } })() </script> 也就是说,这里this的作用域不再是foo对象,而是一个全局的作用域。因此alert(this)相当于alert(window); 所以为object BTW:有可能是||运算符是要把两个表达式的执行转换为全局范围的比较,所以在IE和Opera中,这里(foo.bar || null)返回的是一个全局引用,即:  'bar': function () {  alert(this);//这里的this已经为全局this,全局的this,即为window  }, 详细的,我将在篇末加入一段代码,以示说明 */ bar = foo.bar; bar();//返回的是"[object Window]" /*4.  这里在IE6.0,Mozilla Firefox1.5.0.7和Opera9.0里都为相同的object,如果理解上面的执行,理解这句显然会比较简单 理由同上,这里把foo.bar的引用给到一个全局变量bar,而全局变量都隶属于window的引用,看下面代码: var a = 'never-online'; alert(this.a); //never-online alert(window.a); //never-online 如果你尝试着把bar = foo.bar; bar();改成以下代码,或许就可以明白了 foo.alert = foo.bar; foo.alert (); 这里的foo.alert依然为foo对象的引用,因此foo对象里的this,在这里依然有效,并没有成为window object 因为很明显的bar属性window,因此引用foo.bar里虽然有this,但是this引用为window */ 再看看我们把这个例子改成这样: <script> foo = {  'bar': function () {  var oSelf = this;  alert(this.toString);  if (oSelf==window) {  oSelf = foo;  }  alert(oSelf);  },  'toString': function () {  return 'foo';  } }; window.toString = function () {  alert("引用全局this --- window"); } foo.bar(); (foo.bar)(); (foo.bar || null)(); bar = foo.bar; bar(); </script> 这样应该明白原因了。 从这个例中(foo.bar || null)(); 可以看出Mozilla的解释器会更“标准”一些,而Opera和IE的解释方法则与Mozilla的不一样。||运算符的作用,出现了不同的效果。同我上面所说的, 有可能是||运算符是要把两个表达式的执行转换为全局范围的比较,所以在IE和Opera中,这里(foo.bar || null)返回的是一个全局引用 
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部