作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 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>
预先感谢您的任何建议。
最佳答案
当您传递方法指针时,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()();
与不携带 this
参数的 object.method
语法相反,闭包是可靠的。
关于javascript - 使用 myFuncArray.shift()() 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681341/
我在使用 shift() 调用我放入数组中的函数时遇到问题。我整理了一个简单的例子来说明这个问题。 本质上,该函数被调用,但是,对函数中变量的更改不会保留。 Taco = function()
我是一名优秀的程序员,十分优秀!