通过函数实例访问JS函数变量
问题描述:
我只是想通过不同的方式理解函数中定义的变量的行为。所以我刚刚尝试了一些代码,并在下面作出评论。请告诉我是否理解错误。或者,如果我错过了任何东西,请加上通过函数实例访问JS函数变量
我想知道我怎么能访问像functionName.variableName
通过功能情况(objTempFun1
和objTempFun2
)函数声明的变量就像我可以定义内部功能的方法,通过功能情况暴露闭包变量。
function tempFun() {
this.val1 = "this.var1";
var val2 = "var var2"; //locally scoped var, not added to function instance nor to the prototype
this.getLocalVar = function() {
return val2;
};
this.setLocalVar = function (arg) {
val2 = arg;
};
}
tempFun.prototype.val3 = "fun.proto.var3";
tempFun.val4 = "fun.var4";
var objTempFun1 = new tempFun();
var objTempFun2 = new tempFun();
/*-----------------------------------------------------------------------
Variables defined as `this.variableName`
1. Are declared on prototype
2. Have separate values across instances
3. Cannot be accessed on function itself
-----------------------------------------------------------------------*/
document.write("<br />obj1-this.var1: " + objTempFun1.val1 + "<br />");
document.write("obj2-this.var1: " + objTempFun2.val1 + "<br />");
document.write("fun-this.var1: " + tempFun.val1 + "<br />");
objTempFun1.val1 = "this.var1x";
objTempFun2.val1 = "this.var1y";
document.write("obj1-this.var1: " + objTempFun1.val1 + "<br />");
document.write("obj2-this.var1: " + objTempFun2.val1 + "<br />");
/*-----------------------------------------------------------------------
Variables defined inside function as `var variableName`
1. Are closure-scoped; defined neither on function nor on prototype
2. Have separate values across function instances
3. Can only be accessed through function instance by adding methods on
a prototype (as above getLocalVar and setLocalVar methods)
-----------------------------------------------------------------------*/
document.write("obj1-var var2: " + objTempFun1.val2 + "<br />");
document.write("obj2-var var2: " + objTempFun2.val2 + "<br />");
document.write("fun-var var2: " + tempFun.val2 + "<br />");
document.write("obj1-printLocalVar: " + objTempFun1.getLocalVar() + "<br />");
document.write("obj2-printLocalVar: " + objTempFun2.getLocalVar() + "<br />");
objTempFun1.setLocalVar("var var2x");
objTempFun2.setLocalVar("var var2y");
document.write("obj1-printLocalVar: " + objTempFun1.getLocalVar() + "<br />");
document.write("obj2-printLocalVar: " + objTempFun2.getLocalVar() + "<br />");
/*-----------------------------------------------------------------------
Variables defined as `functionName.prototype.variablename`
1. Are declared on prototype
2. Have separate values across function instances
3. Cannot be accessed on function itself
-----------------------------------------------------------------------*/
document.write("obj1-this.proto.var3: " + objTempFun1.val3 + "<br />");
document.write("obj2-this.proto.var3: " + objTempFun2.val3 + "<br />");
document.write("fun-this.proto.var3: " + tempFun.val3 + "<br />");
objTempFun1.val3 = "fun.proto.var3x";
objTempFun2.val3 = "fun.proto.var3y";
document.write("obj1-this.proto.var3: " + objTempFun1.val3 + "<br />");
document.write("obj2-this.proto.var3: " + objTempFun2.val3 + "<br />");
/*------------------------------------------------------------------------
Variables defined as `functionName.variablename`
1. Become member of function (or say 'F'unction instance, which is tempFun)
not the function instances (which are objTempFun1 & objTempFun2 above)
2. Cannot be accessed on function instances
------------------------------------------------------------------------*/
document.write("obj1-fun.var4: " + objTempFun1.val4 + "<br />");
document.write("obj2-fun.var4: " + objTempFun2.val4 + "<br />");
document.write("fun-fun.var4: " + tempFun.val4 + "<br />");
寻找JSFiddle here。
_“变量定义为'this.variableName' 1.在原型上声明”_ - 不,它们在实例上声明,但可以从原型方法访问。如果它们是在原型上声明的,那么它们不会_“2。在实例中有单独的值。”_ – nnnnnn
第一个也可以说是最重要的规则是:(a)在函数内声明的'val2'变量是'private'并且只能通过函数的特权方法从外部读取/写入,并且(b)对于要特权的方法,它必须是在外部函数中定义的函数,并且可以返回,作为事件处理程序附加,或者定义在形式为'this.foo = function(){...}'(其中cae外部函数必须作为关键字为“new”的构造函数调用)。外部定义的方法总是“公开”,但不是“特权”。 –
@nnnnnn“但可以从原型方法访问”,例如?我在protorype'val3'上声明的变量在'objTempFun1'和'objTempFun2'之间有单独的值 – Mahesha999