1

我在这里打破我的头。我有这个简单的代码:

function myFunc()
{
    this.a = "aaa";

    return {
        h: function ()
        {
                   alert(this.a);
        }
    }
}



var f = new myFunc();
console.log(f.h.apply(f)) //I'm expecting to see here : "aaa" but it says "undefined"

f.h看起来完全像这样:

 function ()
 {
      alert(this.a);
     } 

所以fa试图通过.apply

但它不起作用。

我错过了什么?

ps 还有其他选择。我知道。但为什么我的特定代码不起作用?

4

5 回答 5

6

f不包含 a,因为您返回一个“覆盖”默认对象的任意对象,否则该对象将包含 a。

如果你用过

function myFunc() {
  return {
    a:"aaa",
    h:function() { alert this.a; }
  }
}

那么它会工作!

如果您想使用“私有”和“公共”变量,请像这样

function myFunc() {
  var a = "aaa";
  return {
    h:function() { alert a; }
  }
}
于 2013-04-20T12:12:12.770 回答
5

如果要使用闭包,请创建a为局部变量。这将成为a外部世界无法直接访问的私有财产

function myFunc(){
    var a = "aaa";

    return {
        h: function ()   {
            alert(a);
        }
    }
}

var f = new myFunc();
console.log(f.h(f))

演示:小提琴

于 2013-04-20T12:13:30.713 回答
2

当你从函数中返回一个对象时,你得到的是那个对象,而不是由ˋnewˋ 关键字创建的对象。放置ˋaˋ 属性的对象不再退出。

将方法放在创建的对象中,而不是创建不同的对象:

function myFunc() {
  this.a = "aaa";

  this.h = function () {
    alert(this.a);
  }
}

现在该对象包含该属性,因此您无需使用 apply 来获取正确的上下文:

var f = new myFunc();
console.log(f.h())
于 2013-04-20T12:19:34.137 回答
1

首先,跟踪您退回和打印物品的方式。当您应该只使用一个时,您正在尝试同时使用这两种alert工作。console.log此外,您正在尝试console.log返回不返回任何内容的函数的值。对于下面的示例,我选择使用console.log并保持函数不返回任何内容。下面,我解决了第一个问题:

function myFunc() {
    this.a = "aaa";
    return {h: function () {console.log(this.a);}}
}

var f = new myFunc();
f.h.apply(f);

现在进入真正的问题。this.a返回undefined因为this绑定到不同的两个不同的事物(首先是 的实例myFunc,然后f是 )您在代码中使用它的两次。您可以使用console.log(this)来验证这一点。

为了解决这个问题,绑定一个变量(我们称之为self),this以便您以后可以引用它。在 JavaScript 中,内部函数可以访问绑定在外部函数中的变量。(这称为闭包。)这允许我们以self下列方式使用:

function myFunc() {
    var self = this;
    this.a = "aaa";
    return {h: function() {console.log(self.a);}}
}

var f = new myFunc();
// f.h.apply(f); // replaced by next line; see first comment
f.h();

这会将行打印aaa到控制台。

于 2013-04-20T12:27:31.230 回答
0

你正在失去关闭的范围,试试这个:

function myFunc()
{
    this.a = "aaa";
    that = this;
    return {
        h: function ()
        {
                   alert(that.a);
        }
    }
}



var f = new myFunc();
console.log(f.h.apply(f)) 
于 2013-04-20T12:13:29.283 回答