P39也,讲闭包的。//糟糕的例子
var add_the_handlers = function(nodes){
var i;
for (i = 0; i < nodes.length; i += 1){
nodes[i].onclick = function(e){
alert(i);//这里到底想干什么? 看下边的更好的例子,是想输出e,这里i是啥意思?
}
}
};
//更好的例子
var add_the_handlers = function (nodes){
var i;
for(i = 0; i<nodes.length;i+=1){
nodes[i].onclick = function(i){
return function(e){
alert(e);
};
}(i);
}
};这个更好的例子,(i)是执行的哪个函数?是return回来的函数?如果想立即执行一个函数不是要将函数用括号括起来 (function(){})();这样吗?另外chrome用console.dir 列出一个对象,有一个__proto__的属性,不知道这个是啥。
还有firebug的控制台不能用,报这样的错误,是什么原因?
uncaught exception: _FirebugCommandLine init failed in about:blank because TypeError: window.loadFirebugConsole is not a function
Firebug cannot find firebug-CommandLineAttached document.getUserData , its too early for command line Window about:blank
var add_the_handlers = function(nodes){
var i;
for (i = 0; i < nodes.length; i += 1){
nodes[i].onclick = function(e){
alert(i);//这里到底想干什么? 看下边的更好的例子,是想输出e,这里i是啥意思?
}
}
};
//更好的例子
var add_the_handlers = function (nodes){
var i;
for(i = 0; i<nodes.length;i+=1){
nodes[i].onclick = function(i){
return function(e){
alert(e);
};
}(i);
}
};这个更好的例子,(i)是执行的哪个函数?是return回来的函数?如果想立即执行一个函数不是要将函数用括号括起来 (function(){})();这样吗?另外chrome用console.dir 列出一个对象,有一个__proto__的属性,不知道这个是啥。
还有firebug的控制台不能用,报这样的错误,是什么原因?
uncaught exception: _FirebugCommandLine init failed in about:blank because TypeError: window.loadFirebugConsole is not a function
Firebug cannot find firebug-CommandLineAttached document.getUserData , its too early for command line Window about:blank
* 最优雅的解决方法
*/
var add_the_handlers = function (nodes)
{
function Click(i)
{
nodes[i].onclick = function(){alert(i)}
} for(var i = 0; i<nodes.length; i++)
new Click(i);
};
* 最优雅的解决方法
*
* 此处共3个function
* add_the_handlers:
* 最外层闭包体,里面共享nodes参数
* Click:
* 此function并不直接调用,
* 直接调用则共享i变量。
* 而用new创建一个实例,每个实例都有独立的闭包体
* 一个匿名函数:
* 属于Click闭包内。Click被new之后这个匿名函数独享i变量
*/
var add_the_handlers = function (nodes)
{
function Click(i)
{
nodes[i].onclick = function(){alert(i)}
} for(var i = 0; i<nodes.length; i++)
new Click(i);
};
/**
* Add Click
*/
var add_the_handlers = function (nodes)
{
for(var i = 0; i<nodes.length; i++)
{
new function(i)
{
nodes[i].onclick = function(){alert(i)};
}(i)
}
};
执行的是return回来的函数,不是立马执行,是调用方法的时候才执行。
var add_the_handlers = function (nodes)
{
for(var i = 0; i<nodes.length; i++)
{
+function(i)
{
nodes[i].onclick = function(){alert(i)};
}(i)
}
};
function f(){
alert(x)
}function f2(){
var x=1;
f()
}f2();
var add_the_handlers = function(nodes){
var len = nodes.length;
for (var i = 0; i < len; i++){
(function(obj, index) {
obj.onclick = function(e){
alert(index);
}
})(nodes[i], i);
}
};
这个比较容易理解。
谁能解释一下11楼的 +function 是什么意思啊。
没有这个加号还真不行。
+function(){} 是一个表达式 这样里面的function(){}就变成了一个匿名函数()是调用函数的运算符
与
(function(){...})()
是一样的
是为了让解析器识别为匿名函数并执行之
用其它操作符也可以,比如
-function(){...}()
<li>111111111111</li>
<li>2222222222222222</li>
<li>333333333333333333</li>
</ul>
<script>var add_the_handlers = function (nodes){
var i;
for(i = 0; i<nodes.length;i+=1){
nodes[i].onclick = function(i){//定义onclick动作匿名函数
return function(){
alert(i); 读取返回匿名函数外参数i,并弹出。
};
}(i); //把i当参数传进去
}
};var nodes = document.getElementById('box').getElementsByTagName('li');add_the_handlers(nodes);这样写才是对的。