28,
以下函数有什么问题?如何改进?
·11·
function initButtons() {
var body = document.body, button, i;
for (i = 0; i < 5; i++) {
button = document.createElement(\ button.innerHTML = \ + i;
button.addEventListener(\ (e) { alert(i); }, false);
body.appendChild(button); } }
答案:(1)问题在于点击元素的时候,始终是最后一个被保存的值,因为多次循环的函数,触发事件的i是指向同一个i,可以利用闭包解决这个问题,将遍历的变量作为参数传递进去,这样每个被创建的元素事件都是访问匿名函数语法结构域中的变量了。小提醒,JavaScript的闭包环境由静态的句法结构确定。也就是说,代码一旦写成,我们就知道函数的自由变量同哪些环境里的变量绑定。因此,虽然运行时同一个内函数被调用多次,创建了多个闭包,这些闭包指向的都是同一个环境里的同一个变量。这样同JavaScript规定的闭包语义一致。
(2)改进代码如下
function initButtons() {
var body = document.body, button, i;
for (i = 0; i < 5; i++) {
button = document.createElement(\ button.innerHTML = \
button.addEventListener(\ return function (e) { alert(j); };
}(i), false);
body.appendChild(button); } }
29, 判断一个字符串中出现次数最多的字符,统计出现的次数?
答案:代码如下
var str = \字符例子
strO = {}, //存每个字符出现的次数,有唯一性
max = -1,//出现最多的次数
· 12·
max_key = \出现最多次数的字符
key;
for (var i = 0, l = str.length; i < l; i++) {//过滤每个字符的出现个数 var key = str[i]; if (!strO[key]) { strO[key] = 1; } else {
strO[key]++; } }
for (key in strO) {//寻找次数最多的字符
if (max < strO[key]) { max = strO[key]; max_key = key; } }
console.log(\
30,
请问以下两段代码有什么不同吗?
setTimeout(function() { /* 代码块... */
setTimeout(arguments.callee, 10); }, 10);
setInterval(function(){ /*代码块... */ }, 10);
答案:这两段代码虽然看起来效果差不多,但是本质不一样。第1段回调函数内的setTimeout是等待JavaScript引擎运行之后,才开始设定setTimeout,在上一个设定没有处理完毕之前不会设定下一个定时,理论间隔时间>=10ms;第二段setInterval在设置之后,就会每间隔10ms定时的设置触发线程,理论上两个间隔触发执行的任务是<=10ms