我真的很想这样做:
var Html = function() {
alert('internal: ' + this.val);
};
Html.val = "x";
alert('external: ' + Html.val);
Html();
但它不起作用。为什么?如何获取功能代码以查看创建后设置的值?
- 更新 -
因为我的原始帖子的意图并不是那么明确,而且因为我发布的解决方案比其他海报的意图更接近意图,请允许我说我想要的是一种访问内部的机制一个函数的成员,其明确目的是能够创建一个通用函数,该函数可以在以后独立地播种以修改其行为
答案 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();
您可以从中看到我的函数内部的变量可以从外部访问。这允许我制作一个函数,然后加载一堆数据供它使用,而不必在创建过程中传递参数(这很有用,因为当实际调用函数时(而不是创建函数),它将收到一个不同的参数集)