0

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

"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"一切正常。

提前致谢。

4

2 回答 2

3

在严格模式下,当您调用一个函数而不做任何设置它的this, thisisundefined时,不是对全局对象的引用。这是严格模式的最大区别之一。因此,如果您想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();

于 2017-09-28T17:03:45.860 回答
-1
function foo() {
    console.log(this.bar);
}

'this' 指的是函数 foo 的范围。您可以键入 bar ,其中的范围暗示为 window ,即全局范围。或者你可以输入window.bar。

function foo() {
   console.log(window.bar);
   console.log(bar);
}
于 2017-09-28T17:06:31.407 回答