在函数内访问成员/从外部设置它们

时间:2013-08-28 03:53:18

标签: javascript closures

我真的很想这样做:

var Html = function() {
    alert('internal: ' + this.val);
};
Html.val = "x";
alert('external: ' + Html.val);
Html();

但它不起作用。为什么?如何获取功能代码以查看创建后设置的值?

- 更新 -

因为我的原始帖子的意图并不是那么明确,而且因为我发布的解决方案比其他海报的意图更接近意图,请允许我说我想要的是一种访问内部的机制一个函数的成员,其明确目的是能够创建一个通用函数,该函数可以在以后独立地播种以修改其行为

3 个答案:

答案 0 :(得分:2)

JavaScript函数的this上下文取决于您调用该函数的如何。您可以使用call明确传递上下文:

var Html = function() {
  alert('internal: ' + this.val);
};
Html.call({ val:'x' });

如果您打算将该函数用作构造函数,可以使用new进行实例化:

function Html(val) {
  this.val = val;
}

var html = new Html('x'); // Must be used with `new`
alert('internal: '+ html.val);

如果要扩展对象,可以向prototype添加方法:

Html.prototype.getVal = function() {
  return 'internal: '+ this.val;
};

var html = new Html('x');
alert(html.getVal());

答案 1 :(得分:1)

在Javascript中,“this”是与方法关联的对象,而不是方法本身。最简单的解决方案是将Html函数更改为方法:

var html = {
  val: "x",
  draw: function(){
    console.log('internal: ' + this.val);
  }
}

html.draw();
html.val = "y"
html.draw();

如果你想把html函数保存为直接函数,你可以在方法周围使用包装器。

var Htmldraw = function(){
    return html.draw();
}
html.val = "asd"

或者您可以更改函数以使用词法范围变量而不是“this”

var val;
var Html = function() {
    console.log('internal: ' + val);
};
val = "x";
alert('external: ' + val);
Html();

答案 2 :(得分:0)

谢谢你们花时间发表精心解答的答案。你们两个都得到了感谢。

我会回答我自己的问题,为了一些可能在将来遇到困难的可怜的草皮...我想做的最好完成如下所示(请参阅我在原始帖子中的编辑澄清我的意图是什么):

function fn() {
    this.val = "x";
    this.show = function() {
        alert("internal = " + this.val);
    };
    return this;
};

var x = fn();
alert("initial = " + x.val);
x.val = "y";
alert("reset = " + x.val);
x.show();

您可以从中看到我的函数内部的变量可以从外部访问。这允许我制作一个函数,然后加载一堆数据供它使用,而不必在创建过程中传递参数(这很有用,因为当实际调用函数时(而不是创建函数),它将收到一个不同的参数集)