我在使用shift()来调用我放入数组的函数时遇到了麻烦。我已经汇总了一个说明问题的简单例子。
实际上函数被调用,但是,函数中变量的更改不会被粘住。
<html>
<head>
<script type="text/javascript">
Taco = function() {};
Taco.prototype.init = function() {
this.ex1 = "ex1 in init()";
alert(this.ex1);
};
</script>
</head>
<body>
<input type="Submit" onClick="withShift();" value="withShift"/>
<div id="div1">
</div>
<input type="Submit" onClick="noShift();" value="noShift"/>
<div id="div2">
</div>
<script type="text/javascript">
// This calls init but does not hold the value of ex1 after the call
withShift = function() {
taco = new Taco();
funcQ = [];
funcQ.push(taco.init);
funcQ.shift()();
div1 = document.getElementById("div1")
div1.appendChild(document.createTextNode(taco.ex1));
};
// this calls init and it holds the value...
noShift = function() {
taco2 = new Taco();
taco2.init();
div1 = document.getElementById("div2")
div1.appendChild(document.createTextNode(taco2.ex1));
}
</script>
</body>
</html>
提前感谢您提出任何建议。
答案 0 :(得分:1)
当您传递方法指针时,JavaScript不记得this
参数。您必须使用函数对象上的call
或apply
方法显式传递this
。
在传递函数指针时,使用taco.init
与使用Taco.prototype.init
大致相同。以下是工作方式:
taco = new Taco();
funcQ = [];
funcQ.push(taco.init);
// pass taco first, and the non-hidden function arguments after;
// in this case, no other argument
funcQ.shift().call(taco);
如果您不能使用这种语法,则可以使用匿名函数:
taco = new Taco();
funcQ = [];
funcQ.push(function() { taco.init(); });
funcQ.shift()();
与没有object.method
参数的this
语法相反,闭包是可靠的。