Javascript 为什么此代码在“未定义”中抛出;“严格模式”;

Javascript 为什么此代码在“未定义”中抛出;“严格模式”;,javascript,Javascript,为什么此代码抛出未定义的 function Obj() { this.a = 12; this.b = "a"; this.privilegedMethod = function () { this.a++; privateMethod(); }; function privateMethod() { this.b = "foo"; console.log(this.b); } } 调用下面的函数,抛出。。。在“

为什么此代码抛出未定义的

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
     console.log(this.b);
   }
}
调用下面的函数,抛出。。。在“严格模式”中未定义


JavaScript中
this
的值是根据函数的调用方式设置的。这是“上下文”

当您
a.privilegedMethod()
时,您正在
a
的“上下文”中调用
privilegedMethod()
。在内部,该方法,
将是
a

调用
privateMethod()
时,没有“上下文”。在严格模式之外,
将是
窗口
,但在严格模式下它是
未定义的


试试这个:
privateMethod.call(this)
因为privateMethod不是一个方法,它只是构造函数范围内的一个函数,所以
this.b=“foo”
没有指向您的实例,因此它正在查找
window.b
。在标记为未定义的严格模式下。

您希望
privateMethod
中是什么?当我尝试从上下文“a”调用privlege方法时,仍然无法定义。你从哪里得到未定义的代码。。哦这是因为您正在执行
console.log(a.privilegedMethod())
privilegedMethod()
不返回任何内容?您希望它记录什么?请注意,您在评论中发布的JSFIDLE并不像您认为的那样。该代码没有在严格模式下运行。调用
privateMethod()
时,它正在设置
window.b
!您仍然需要执行
privateMethod.call(this)。谢谢火箭,从哪里我需要调用privateMethod。调用(这个),我在这里感到困惑?而且在最新的浏览器中,它默认处于严格模式,对吗?我不确定浏览器是否默认为严格模式,我认为您需要添加
使用严格模式命令。另外,只需替换行
privateMethod()privateMethod.call调用(this)
var a = new Obj();
console.log(a.privilegedMethod());