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