在严格模式下编写脚本时出现无法读取 属性 'any' 类型错误

getting can't read property 'any' type error when we script in strict mode

在使用 strict mode 时,我正在 type error 使用 this 访问 var

"use strict";
var bar = "global";

function foo() {
    console.log(this.bar);
}



var obj1 = {
    bar: "obj1",
    foo: foo
};

var obj2 = {
    bar: "obj2"
};

foo();

obj1.foo();
foo.call(obj2);
new foo();

截图:

foo(); 导致了问题。如果我删除 "use strict" 一切正常。

提前致谢。

在严格模式下,当你调用一个函数而不做任何设置它的 this 时,thisundefined,而不是对全局对象的引用。这是严格模式的一大区别。因此,如果您想使用对全局对象的引用来调用 foo,您可以:

  1. 在全局范围内,执行foo.call(this);(因为this在全局范围内是对全局对象的引用),或者

  2. 在浏览器上,执行 foo.call(window);(因为 window 是全局对象上的 属性,它用于指向自身——其他环境也可能有其他类似的全局变量)

这是#1 的示例:

"use strict";
var bar = "global";

function foo() {
    console.log(this.bar);
}



var obj1 = {
    bar: "obj1",
    foo: foo
};

var obj2 = {
    bar: "obj2"
};

foo.call(this); // <=== changed

obj1.foo();
foo.call(obj2);
new foo();

...和#2:

"use strict";
var bar = "global";

function foo() {
    console.log(this.bar);
}



var obj1 = {
    bar: "obj1",
    foo: foo
};

var obj2 = {
    bar: "obj2"
};

foo.call(window); // <=== changed

obj1.foo();
foo.call(obj2);
new foo();

function foo() {
    console.log(this.bar);
}

'this'指的是函数foo的作用域。 您可以键入 bar,其中隐含范围为 window,即全局范围。或者您可以输入 window.bar.

function foo() {
   console.log(window.bar);
   console.log(bar);
}