【问题标题】:this.property returns undefined in nodejsthis.property 在 nodejs 中返回 undefined
【发布时间】:2014-02-18 13:37:32
【问题描述】:

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

我使用 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,..

也许我误解了“这个”的工作原理,但经过数小时的搜索和尝试后,我一无所知..

【问题讨论】:

    标签: javascript node.js this


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答 Ronny,但我不能真正做到这一点,因为我必须通过对象传递函数(也许应该提到这一点)。我已经更新了我的问题。
    【解决方案2】:

    我在 node、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:{姓名:“约翰”,年龄:23​​,妻子:“珍妮”}

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

    functions.up.call(obj);
    

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

    【讨论】:

    • 会不会和node.exe的版本有关?我有文件版本:0.10.25.0,产品版本:0.10.25
    • 我运行的是相同的 Node 版本,所以这不是问题。另外你的代码单独工作正常,但是当它与我上面提到的 npm 模块一起使用时github.com/InterNACHI/mongoose-data-migrations 它有同样的问题,所以它一定是模块的问题但是我找不到它有什么问题.. 仍然毫无头绪。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2017-09-09
      • 2021-09-16
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 2018-02-06
      相关资源
      最近更新 更多