I dont't know the reason exactly, but I can tell you that 'i' seems to be a Global variable even if you put the codes in a function.use my code:<body>
<script>
Function.prototype.getHandler = function (obj) {
var oThis = this;
var argu = Array.prototype.slice.call(arguments, 1);
return function (){
oThis.apply(obj, argu);
};
};function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
o.attachEvent("onclick", doClick.getHandler(null,i));
document.body.appendChild(o);
}
</script>
</body>If you don't know about "call","apply", you can see the Javascript Reference, or
http://community.csdn.net/Expert/topic/3191/3191873.xml?temp=.337063Good luck.
<script>
Function.prototype.getHandler = function (obj) {
var oThis = this;
var argu = Array.prototype.slice.call(arguments, 1);
return function (){
oThis.apply(obj, argu);
};
};function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
o.attachEvent("onclick", doClick.getHandler(null,i));
document.body.appendChild(o);
}
</script>
</body>If you don't know about "call","apply", you can see the Javascript Reference, or
http://community.csdn.net/Expert/topic/3191/3191873.xml?temp=.337063Good luck.
function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
eval("o.attachEvent(\"onclick\", function(){doClick(" + i + ");});")
document.body.appendChild(o);
}
</script>
alert(x);
};
for (var i=0;i<3;i++) {
var o = document.createElement("input");
o.setAttribute("idx", i);
o.attachEvent("onclick", function(){ doClick(event.srcElement.idx); });
document.body.appendChild(o);
}
在传递i变量
2. o.attachEvent("onclick", function(){ doClick(i); });
在传递数字,没有传递变量
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
// o.attachEvent("onclick", function(){ doClick(i); });
o.attachEvent("onclick", new Function("doClick("+i+")"));
document.body.appendChild(o);
}
传递参数是object时,试过了??
function doClick(x) {
alert(x);
}for (var i=0;i<10;i++) {
var o = document.createElement("button");
o.onclick = Function("doClick(i);");
document.body.appendChild(o);
}</script>
function doClick(x) {
alert(x);
};for (var i=0;i<10;i++) {
var o = document.createElement("input");
o.attachEvent("onclick", function(){ doClick(i); });
document.body.appendChild(o);
}i = 4;</script>
function doClick(x) {
alert(x);
}function mapping(o, i)
{
o.onclick = function()
{
alert(i);
}
}for (var i=0;i<10;i++) {
var o = document.createElement("input");
mapping(o, i);
document.body.appendChild(o);
}
</script>
function doClick(x) {
alert(x);
}function mapping(o, i)
{
o.onclick = function()
{
doClick(i);
}
}for (var i=0;i<10;i++) {
var o = document.createElement("input");
mapping(o, i);
document.body.appendChild(o);
}
</script>
function doClick(x) {
alert(x);
}function mapping(element, value)
{
element.attachEvent("onclick", function()
{
doClick(value);
})
}for (var i=0;i<10;i++) {
var o = document.createElement("input");
mapping(o, i);
document.body.appendChild(o);
}
</script>
和
Function("doClick(" + i + ")")属于投机取巧的答案。
function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
eval("o.attachEvent(\"onclick\", function(){doClick(" + i + ");});")
document.body.appendChild(o);
}
</script>这段代码没问题,但是不能放到<head></head>里了!!必须放到</html>后面才能正确执行!!这样说你就能名白为什么了吧:)
function f(){ for (i=0; i<5; i++){} }
</script>其次,runming给出了正确的答案,但是他并没有说清为什么原来的是错的function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
o.attachEvent("onclick", function(){ doClick(i); });
document.body.appendChild(o);
}在o.attachEvent中创建的function并没有任何参数,i不过是for创建的一个变量而已,这就相当于function在函数体{}中的语句中直接使用变量i来调用函数doClick,因此i的任何改动都将反应出来,跟i是引用还是值并没有关系,而runming的答案正是改正了这个问题function doClick(x) {
alert(x);
}function mapping(element, value)
{
element.attachEvent("onclick", function()
{
doClick(value);
})
}for (var i=0;i<10;i++) {
var o = document.createElement("input");
mapping(o, i);
document.body.appendChild(o);
}for中创建函数时i的值已赋值给value,如是引用,则value也已得到i的引用,这样,即使i已改变,也不会影响到value的值再次,为了验证function中确实是使用变量i直接调用doClick,改代码如下
<script>
function doClick(x) {
alert(x);
};function f()
{
for (var i=0;i<10;i++) {
var o = document.createElement("input");
o.attachEvent("onclick", function(){ doClick(i); });
document.body.appendChild(o);
}
}
</script><body onload="f()")>此时,alert的值依然是10,这可以说明function确实是使用了i,这个i在这里虽然是函数级变量,但是由于function创建于f,所以i对于function来说仍然是全局的,也就是创建的每个function都使用变量i来调用doClick,因此仍然是一样的最后,说说所谓的“投机”做法<script>
function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
eval("o.attachEvent(\"onclick\", function(){doClick(" + i + ");});")
document.body.appendChild(o);
}
</script>很明显,在for中创建的function 本身就使用常数了,i的位置其实变成一个字符串常数,也就是说function的内容就是doClick(某常数),自然这个常数是不会被i影响的,所以在值类型的时候,此方法是可行的,而使用引用类型时则不行<script>
function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var d = new Date(2000,i+1,i+1);
var o = document.createElement("input");
eval("o.attachEvent(\"onclick\", function(){doClick(" + d + ");});")
document.body.appendChild(o);
}
</script>上面的代码是错误的,因为d是对象而不是值总结:严重同意runming中
<script>
function doClick(x) {
alert(x);
}function mapping(sHandler, element, f)
{
var argu = Array.prototype.slice.call(arguments, 3);
element.attachEvent(sHandler, function()
{
f.apply(null,argu);
})
}for (var i=0;i<10;i++) {
var o = document.createElement("input");
mapping("onclick", o, doClick, i);
document.body.appendChild(o);
}
</script>本质上和我写的还是一样的
可以在<SCRIPT LANGUAGE="JavaScript" defer> 加defer 参数,就应该可以执行了。
<html> <body> <form>
// html code here
</form>
</body>
</html>************************************关于for循环的第一个表达式。
for(var i=0;i<10;i++) //这个i是与for平齐的,平级的
//这样说吧,等价于在for语句上面已经声明了i,就像下面代码一样
var i=0;
for(i=0;i<10;i++)
//这样看来,i就是全局的了(更确切说,i和for的作用域是一样的)
<script language="javascript">
for(var i=0;i<10;i++) // i全局的</script><script language="javascript">
function f(){
for(var i=0;i<10;i++) // i局部的,f()函数内有效
}
</script>
for (var i=0;i<10;i++) {}
alert(i)结果和期望的不同。
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
o.i=i;
o.attachEvent("onclick", function(){ doClick(this.i); });
document.body.appendChild(o);
}