使用this.str时变量未定义

时间:2018-10-16 18:11:40

标签: javascript node.js visual-studio-code

我这里有一些简单的代码,它们是在Quokka和NodeJS的Visual Studio Code中运行的。

var str = "hello"

function printStr(){
    console.log(this.str);
}

printStr();

输出:

undefined​​​​​ at ​​​this.str​​​ ​quokka.js:6:4​

我可以在Web浏览器中很好地运行此代码,并且可以正常工作,并打印出“ hello”。

“使用严格”;未启用

屏幕截图:https://i.imgur.com/IEQwv5D.png

3 个答案:

答案 0 :(得分:1)

在这种情况下,在浏览器中,this将被解释为窗口对象,并且变量str将在窗口中定义。 Node中没有窗口对象。目前尚不清楚为什么在这里完全使用this而不是使用常规作用域规则。这将在浏览器和Node中都可以使用:

var str = "hello"

function printStr(){
    console.log(str); // will see outside scope
}

printStr();

更好的是,将值传递给函数,以使其不依赖于超出其范围定义的值:

var str = "hello"

function printStr(s){
    console.log(s);
}

printStr(str);

在Node中有一个global对象,它与浏览器的window对象有一些相似之处,因此像这样的代码 可以在Node中工作,但这是相当合理的非标准方式:

global.str = "hello"

function printStr(){
    console.log(this.str)  
}

printStr();

答案 1 :(得分:0)

function this内部通常引用window对象,并且变量str未在窗口上定义。

您可以简单地称呼它

var str = "hello"
function printStr(){
    console.log(str);
}
printStr();

答案 2 :(得分:0)

我希望mi的答案会有所帮助。节点JS中未定义对象' this ',因为元素 window 不存在,并且您没有在使用任何对象,构造函数或类。

例如:

var Animal = function(kind) {
    this.name = "NN"
    this.kind = kind    
};

Animal.prototype.printName = function() {console.log(this.name)};
Animal.prototype.setName = function(name){this.name = name}

var a1 = new Animal("Lion");
var a2 = new Animal("Cat");

a1.setName("Robert");
a2.setName("Alex");

a1.printName();
a2.printName();

使用句子 this 时,请查看代码。如有疑问,请给我写信! (是)