Javascript 理解';这';对象上下文

Javascript 理解';这';对象上下文,javascript,prototype,Javascript,Prototype,我不明白当不使用new关键字时,BigObject构造函数中的这个如何可以未定义——请参见下面的示例。给定Firebug中的以下代码片段: ( function( global ){ "use strict"; var fromunderbutter = "fun"; global.BigObject = function( options ){ console.log( this ); console.log( thi

我不明白当不使用
new
关键字时,BigObject构造函数中的
这个
如何可以
未定义
——请参见下面的示例。给定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()
据我所知,
这个
指的是当前的对象上下文。在上面的示例中,由于使用了new关键字,
this
将引用一个新创建并应用于函数调用的空白对象

但下一部分对我来说毫无意义:

>>> BigObject()
>>> undefined  
>>> false
为什么
这个
没有定义?我假设
这个
会引用一些东西——可能是全局对象窗口。不知道该如何看待这个结果


感谢

在严格模式下,当在没有上下文的情况下调用函数时,
未定义的

当控件为函数对象
F
中包含的函数代码、调用者提供的
thisArg
和调用者提供的
参数列表
输入执行上下文时,将执行以下步骤:

  • 如果功能代码是严格代码,请将ThisBinding设置为
    thisArg
  • 否则,如果
    thisArg
    null未定义,则将ThisBinding设置为全局对象
  • 否则,如果
    Type(thisArg)
    不是对象,则将ThisBinding设置为
    ToObject(thisArg)
  • 否则将ThisBinding设置为
    thisArg
  • localEnv
    作为调用NewDeclarativeEnvironment的结果,并将
    F
    的[[Scope]]内部属性的值作为参数传递
  • 将词典环境设置为
    localEnv
  • 将VariableEnvironment设置为
    localEnv
  • 设code为
    F
    的[[code]]内部属性的值
  • 使用功能代码
    code
    argumentList
    执行声明绑定实例化,如10.5所述

  • 提供的代码是严格的代码,调用的
    thisArg
    是未定义的
    (没有为调用提供上下文)。

    在严格模式下,当在没有上下文的情况下调用函数时,
    是未定义的

    当控件为函数对象
    F
    中包含的函数代码、调用者提供的
    thisArg
    和调用者提供的
    参数列表
    输入执行上下文时,将执行以下步骤:

  • 如果功能代码是严格代码,请将ThisBinding设置为
    thisArg
  • 否则,如果
    thisArg
    null未定义,则将ThisBinding设置为全局对象
  • 否则,如果
    Type(thisArg)
    不是对象,则将ThisBinding设置为
    ToObject(thisArg)
  • 否则将ThisBinding设置为
    thisArg
  • localEnv
    作为调用NewDeclarativeEnvironment的结果,并将
    F
    的[[Scope]]内部属性的值作为参数传递
  • 将词典环境设置为
    localEnv
  • 将VariableEnvironment设置为
    localEnv
  • 设code为
    F
    的[[code]]内部属性的值
  • 使用功能代码
    code
    argumentList
    执行声明绑定实例化,如10.5所述

  • 提供的代码是严格的代码,调用的
    thisArg
    是未定义的(没有为调用提供上下文)。

    如果没有元素事件,就不能定义它。

    如果没有元素事件,就不能定义它。

    因为语言规范说它应该这样做

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

    在这种情况下,原因可能是当使用和不使用新函数调用同一函数时,该函数将执行完全不同的操作。那绝对不是个好主意。你可能会想出一个奇怪的例子,在那里它做了一些有用的事情,但总有一种可读性和可维护性更好的方法来做同样的事情


    语言特征与法律相反:你不能仅仅因为需要三秒以上的时间来考虑为什么它们总是让所有人都无法忍受而添加它们。只有当你有一个令人信服的、经过深思熟虑的、经过彻底研究和测试的理由相信它们对很多人都非常有用,而且几乎从来没有破坏性的时候,你才会添加它们。当然,如果您正在设计Visual Basic或tcl

    因为语言规范说它应该这样做

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

    在这种情况下,原因可能是当使用和不使用新函数调用同一函数时,该函数将执行完全不同的操作。那绝对不是个好主意。你可能会想出一个奇怪的例子,在那里它做了一些有用的事情,但总有一种可读性和可维护性更好的方法来做同样的事情

    语言特征与法律相反:你不能仅仅因为需要三秒以上的时间来考虑为什么它们总是让所有人都无法忍受而添加它们。只有当你有令人信服的、经过深思熟虑的、经过彻底研究和测试的理由相信它们对很多人和almos非常有用时,你才会添加它们
    (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);