上次讨论了一段代码alert不出正常的值得问题 如下:$(function(){
var nowurl = location.href;
var urls = new Array();
urls[0] = "Cambodia";
urls[1] = "China";
urls[2] = "English";
urls[3] = "HongKong";
urls[4] = "Thailand";
urls[5] = "Vietnam";
for (var i = 0; i < 6; i++) {
lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu").click(function(){
alert(lan); //这里的lan变量 值为NULL 如果直接放在click(alert(lan))就没问题
})
}后来修改为如下代码正常解决问题for (var i = 0; i < 6; i++) {
lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu").click((function(n){
return function(){
alert(n);
}
})(lan));
}
}
他的原理就是:
for循环时 和 click触发时 是不同的两个时间。 循环中的产生的变量i 在click时已经不存在了。
所以要通过全局变量或者闭包的形式把具体的值保存下来。例子:
for循环作用域问题
以下程序会alert什么?
答案是 2 , 2
其实理应让其alert 0,1才对var arr = [];
for(var i=0; i< 2;i++){
(function(j){
var fn = function(){
alert(j)
}
arr.push(fn);
}(i)); // 创建一个匿名函数并立即执行,传入参数i
}
for(var j in arr){
var fn = arr[j];
fn();
}
var arr = []; for(var i=0; i< 2;i++){
(function(j){
var fn = function(){
alert(j)
}
arr.push(fn);
}(i)); // 创建一个匿名函数并立即执行,传入参数i
} for(var j in arr){
var fn = arr[j];
fn();
}
原理清楚了但是问题又来了,不是我不会思考其原因,因为小弟确实才接触这一行,很多小地方的细节和方法原理不太清楚
代码如下,这个代码跟第一段代码差不多大同小异,关键也是在for循环下的函数里面,不是说for循环时 和 click触发时 是不同的两个时间。 循环中的产生的变量i 在click时已经不存在了。
所以要通过全局变量或者闭包的形式把具体的值保存下来吗。
是不是我可以理解为for循环下的函数都不能保存值啦。但是却不是的下面代码的第一个函数可以正确alert出lan变量。
$(function(){
var nowurl = location.href;
var urls = new Array();
urls[0] = "Cambodia";
urls[1] = "China";
urls[2] = "English";
urls[3] = "HongKong";
urls[4] = "Thailand";
urls[5] = "Vietnam";for (var i = 0; i < 6; i++) {
var lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu li").each(function(index){
//alert(lan); 如果在此处alert 是正确的
//为什么在此处函数下可行,在下面函数就不行了啦。大概知道是变量作用域的问题,但是不太详细知道原理,求教......
$(this).click(function(){
alert(lan); //但是在此处就不行 这个是上面已经论证了的
})
})
var nowurl = location.href;
var urls = new Array();
urls[0] = "Cambodia";
urls[1] = "China";
urls[2] = "English";
urls[3] = "HongKong";
urls[4] = "Thailand";
urls[5] = "Vietnam";
for (var i = 0; i < 6; i++) {
lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu").click(function(){
alert(lan); //这里的lan变量 值为NULL 如果直接放在click(alert(lan))就没问题
})
}后来修改为如下代码正常解决问题for (var i = 0; i < 6; i++) {
lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu").click((function(n){
return function(){
alert(n);
}
})(lan));
}
}
他的原理就是:
for循环时 和 click触发时 是不同的两个时间。 循环中的产生的变量i 在click时已经不存在了。
所以要通过全局变量或者闭包的形式把具体的值保存下来。例子:
for循环作用域问题
以下程序会alert什么?
答案是 2 , 2
其实理应让其alert 0,1才对var arr = [];
for(var i=0; i< 2;i++){
(function(j){
var fn = function(){
alert(j)
}
arr.push(fn);
}(i)); // 创建一个匿名函数并立即执行,传入参数i
}
for(var j in arr){
var fn = arr[j];
fn();
}
var arr = []; for(var i=0; i< 2;i++){
(function(j){
var fn = function(){
alert(j)
}
arr.push(fn);
}(i)); // 创建一个匿名函数并立即执行,传入参数i
} for(var j in arr){
var fn = arr[j];
fn();
}
原理清楚了但是问题又来了,不是我不会思考其原因,因为小弟确实才接触这一行,很多小地方的细节和方法原理不太清楚
代码如下,这个代码跟第一段代码差不多大同小异,关键也是在for循环下的函数里面,不是说for循环时 和 click触发时 是不同的两个时间。 循环中的产生的变量i 在click时已经不存在了。
所以要通过全局变量或者闭包的形式把具体的值保存下来吗。
是不是我可以理解为for循环下的函数都不能保存值啦。但是却不是的下面代码的第一个函数可以正确alert出lan变量。
$(function(){
var nowurl = location.href;
var urls = new Array();
urls[0] = "Cambodia";
urls[1] = "China";
urls[2] = "English";
urls[3] = "HongKong";
urls[4] = "Thailand";
urls[5] = "Vietnam";for (var i = 0; i < 6; i++) {
var lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu li").each(function(index){
//alert(lan); 如果在此处alert 是正确的
//为什么在此处函数下可行,在下面函数就不行了啦。大概知道是变量作用域的问题,但是不太详细知道原理,求教......
$(this).click(function(){
alert(lan); //但是在此处就不行 这个是上面已经论证了的
})
})
lan = nowurl.match(urls[i]);
//这里你直接写成lan='abc' 看看还为null吗,下面alert(lan)值为null是因为你没匹配到合适的值
这是因为
if (lan != null){
alert(lan);
//上面lan!=null 肯定不会输出null啦,但是for循环后lan变成了null
(因为没有匹配到lan = nowurl.match(urls[i]))
}
这个lan的值一直指向 lan = nowurl.match(urls[i])
nowurl.match(urls[i]) 的值是多少lan就是多少,最后一次循环如果没有匹配到的话,就为null