我在想,重新声明一个本地javascript变量会被忽略,但我很惊讶这个函数总是返回“null”。当我从第二个“var qty”声明中删除“ var ”时,它开始返回有效数量。
可能是什么原因?我在Google Chrome扩展程序的顶部使用“use strict”。
function get_quantity(firstname)
{
var qty = null;
var firstindex = 3;
var qtyindex = 5;
$('#' + gg_first_id + " tr").each(function (index)
{
console.log("index=" + index);
if (index == 0)
{
return;
}
var firstnamere = new RegExp(firstname,"i");
if ($(this).find('td:eq(' + firstindex + ')').text().trim().match(firstnamere))
{
var qty = $(this).find('td:eq(' + qtyindex + ')').text().trim();
qty = parseFloat(qty.replace(/,/, ''));
return false;
}
});
return qty;
}
答案 0 :(得分:4)
原因是重新声明局部变量不被忽略。会发生的是,新局部变量qty
被创建,在<{1}}处理程序的上下文中阴影旧的变量each
。只要each
返回,就会恢复旧变量。
答案 1 :(得分:2)
这是范围问题。
当您在匿名qty
函数内定义function (index)
时,它会创建一个新的局部变量,该变量仅存在于该函数的范围内。该局部变量是它自己的变量,并且与更宽范围的qty
变量没有关联。
考虑一下:
var i = 1;
//Expected value is 1
console.log(i);
function initVar(){
var i = 2;
//Expected value is 2
console.log(i);
}
//Set the local variable inside the function to 2. Does not affect outer scope.
initVar();
//Expected value is 1
console.log(i);
&#13;
答案 2 :(得分:0)
我只想根据@ Unlocked的答案添加两个简单的例子。正如您在下面的示例中所看到的,您可以看到第一个i
绑定到外部作用域,而另一个i
绑定到内部作用域。正如您在运行示例this === that
时所看到的那样,这意味着this.i
是外部作用域的i
,由于声明了变量,它隐藏在自调用函数中同名。
var i = 1
var that = this
;(function(){
var i = 2
// `i` of the inner scope
console.log('i:', i)
// `i` of the outer scope
console.log('this.i:', this.i)
// proving that `this` is the the outer scope
console.log('this === that:', this === that)
})()
您似乎想到的是所有变量都在范围顶部实例化(未声明),这是正确的,但您必须知道范围是什么。在下面的示例中,您可以看到在函数中声明变量之前可以使用console.log()
,因为Javascript的工作原理。
;(function(){
// `i` will be declared but not defined
console.log('i:', i)
var i = 1
})()
;(function(){
// `i` will not be declared in this scope
console.log('i:', i)
function anonymous(){
var i = 1
}
})()