this.property在nodejs中返回undefined

时间:2014-02-18 13:37:32

标签: javascript node.js this

我正在节点中编写应用程序,但我遇到了一些奇怪的事情。

我使用call()方法将对象传递给函数以修改该对象。当我在执行console.log(this)时在函数内部,它返回对象很好,但是当我尝试执行console.log(this.foo)或尝试修改对象时,它表示未定义。 更新:我还要提到我在对象中传递此函数,因为我必须将函数注入到另一个函数中。 (更具体地说,我正试图让this工作。也许这也是问题的一部分。

var obj = {name: "John", age: 23};
var functions = {up: function() { /* do stuff */ }, down: function() { /* do stuff */
functions.up.call(obj);

up: function() {
    console.log(this); //returns {name: "John", age: 23}
    console.log(this.name); //returns undefined
    this.wife = "Jenny"; //doesn't do anything
}

但是,如果我使用'_'设置属性,它们确实存在,但在调用console.log(this)时不显示;

up: function() {
    this._wife = "Jenny"; //doesn't do anything
    console.log(this._wife); //returns "Jenny"
    console.log(this); //still returns {name: "John", age: 23}
}

我尝试过所有的事情,例如使用this.set(key,value),this.get(key),this.attributes [“name”]。value,..

也许我误解了'这个'是如何运作的,但是经过几个小时的搜索和尝试,我一无所知......

3 个答案:

答案 0 :(得分:2)

在控制台中尝试代码时,我将语法修改为函数表达式,它对我有用,也许这是你的问题?

var obj = {name: "John", age: 23};
up.call(obj);

function up() {
    console.log(this); //returns {name: "John", age: 23}
    console.log(this.name); //returns "John"
    this.wife = "Jenny"; // works
    console.log(this);
}

答案 1 :(得分:0)

我正在从节点中获得工作输出,chrome / win7& notepad ++插件:

var obj = { name: "John", age: 23 };
var functions = {
  up: function() {
      console.log(this); //returns {name: "John", age: 23}
      console.log(this.name); //returns undefined
      this.wife = "Jenny"; }, //doesn't do anything
  down: function(){ } }
functions.up.call(obj);
console.log('obj:',obj);

输出:

  

{姓名:'约翰',年龄:23​​}   约翰
  obj:{姓名:'John',年龄:23​​岁,妻子:'Jenny'}

您对“这个”的理解似乎是正确的 你可以尝试替换

functions.up.call(obj);

temp = obj.up;
obj.up = functions.up;
obj.up();
obj.up = temp;//or: delete obj.up;

答案 2 :(得分:0)

我遇到了同样的问题。最后我找到了解决方案 - 我将有问题的代码放在圆括号中:

var i = node.declarations.length; //Error: cannot get length of undefined
var i = (node.declarations).length; // 11

我想你应该做那样的事情:

console.log((this.name).toString()); 

console.log((this.name));