1

我不明白thisBigObject 构造函数undefined在不使用new关键字时的作用——请参见下面的示例。鉴于 Firebug 中的以下代码片段:

( function( global ){  
  "use strict";   
  var fromunderbutter = "fun"; 
  global.BigObject = function( options ){      
       console.log( this );      
       console.log( this instanceof BigObject );  
  };    
})( this );

以下代码有意义:

>>> var x = new BigObject();
>>> Object { }  // new constructor creates blank object context that is assigned to BigObject 
>>> true  // BigObject was the object context ( this ) that invoked BigObject()

据我了解,this指的是当前对象上下文。在上面的示例中,由于 new 关键字,this将引用一个空白对象,该对象将被新创建并应用于函数调用。

但是下一部分对我来说没有意义:

>>> BigObject()
>>> undefined  
>>> false

为什么是this未定义的?我认为这this将指代某些东西——可能是全局对象窗口。不知道如何看待这个结果。

谢谢

4

4 回答 4

4
于 2013-05-29T19:38:29.403 回答
0

如果没有元素的事件,就无法定义 this。

于 2013-05-29T19:41:58.740 回答
0

因为这就是语言规范所说的应该做的。

听起来像是一个翻转的答案,但事实并非如此。严格来说,它是任意的:你可以编写一个编译器来做任何事情,但它可以想象的大部分事情都是一个坏主意。这些事情通常有充分的理由。

在这种情况下,原因可能是同一个函数在使用和不使用 new 时会做完全不同的事情。那绝不是一个好主意。您可能会想出一个奇怪的案例,它会做一些有用的事情,但总会有一种更易读和可维护的方式来做同样的事情。

语言特性与规律相反:你不会仅仅因为要花三秒钟以上的时间才能想到任何理由,为什么它们总是绝对每个人都完全无法忍受。只有当你有一个令人信服的、经过深思熟虑的、经过彻底研究和测试的理由相信它们对很多人非常有用并且几乎从不具有破坏性时,你才会添加它们。或者,如果您正在设计 Visual Basic 或 tcl,当然。

于 2013-05-29T19:42:33.330 回答
0

如果要解决此问题,请使用:

(function(global){  
  "use strict";   
  var fromunderbutter = "fun"; 
  global.BigObject = function (options) {
    if (!(this instanceof BigObject)) return new BigObject(options);     
    console.log(this);      
    console.log(this instanceof BigObject);  
  };    
})(this);

正如 zzzzBov 所提到的,您需要绑定this到模仿BigObject存在this才能使用您当前的代码。这需要做:BigObject.bind(new BigObject())({ /* options */ }). 这显然不是调用代码的理想方式。

于 2013-05-29T19:43:46.400 回答