1

我真的很想这样做:

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

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

- 更新 -

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

4

3 回答 3

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());
于 2013-08-28T04:05:26.290 回答
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();
于 2013-08-28T04:08:33.010 回答
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();

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

于 2013-08-31T21:15:09.323 回答