这完全取决于您需要该变量存在的位置。JS将提升变量到当前作用域的顶部(其中它被声明)或创建一个(邪恶的)全局变量,如果未声明var。
如果您在循环中声明一个变量,实际上并不重要:
for (var i=0;i<10;i++)
{
var j = 1*2;
}
被翻译成:
var i, j;
for (i=0;i<10;i++)
{
j = 1*2;
}
以下是一些经验法则:
- 如果你正在使用全局变量,那么你可能犯了一个错误
- 如果你在循环中声明变量,那么你可能根本不需要那个变量
- 如果你没有声明变量,请尝试使用以下脚本:
(function()
{
'use strict';
}());
并进行调试,直到消除全局变量。
在你的例子中,你提供了在全局作用域(或者说是在$(document).ready(callback
作用域内)声明show_id
的选择,或者在click
处理程序内部声明。没有什么可以阻止你在each
回调函数中声明变量,虽然在这种情况下不会有太大的区别,但这是另外一回事。
在JS中,函数都有自己的作用域,你需要在需要它的作用域中声明变量。
话虽如此,我注意到你的性能标签,从效率的角度来看,你的代码几乎是最糟糕的。而不是遍历行并在各处绑定事件处理程序:委托事件:
$('#my_table').on('click','tr',function(e)
{
var show_id = e.target.attr('data-show-id');
});
在这段代码中,
show_id
将在单击处理程序返回后被垃圾回收,如果你想保留
show_id
,例如检查下一行何时被单击:
$('#my_table').on('click','tr',(function (show_id)
{
return function(e)
{
console.log('show_id was: ' + show_id);
show_id = e.target.attr('data-show-id');
console.log('and is now: ' + show_id);
};
}()));
console.log(show_id);
变量在作用域内(包裹
return function
的函数是声明
show_id
的作用域),但其返回值引用该变量,因此它不会被垃圾回收。在返回的函数之外,我们处于更高的作用域,因此根本无法访问该变量。我们可以做的是暴露其值:
var someVar = {};
$('#my_table').on('click','tr',(function (show_id)
{
return function(e)
{
show_id = e.target.attr('data-show-id');
someVar.myTableClicks = show_id;
console.log(someVar.myTableClicks);
};
}()));
console.log(someVar.myTableClicks);
console.log(someVar.myTableClicks);
现在,我们可以在任何可以访问
someVar
的地方访问
show_id
的值。
个人而言,我更喜欢保持需要某些变量可用的组代码:
var access = (function(timer)
{
var speed = 100,
begin = function(callback, interval)
{
speed = +(interval) || speed;
timer = setInterval(callback, speed);
},
stop = function()
{
clearInterval(timer);
};
return {start: start, stop: stop};
}());
在这个例子中,
start
和
stop
函数都需要访问
timer
变量,但我不希望外部代码干扰
timer
的值,所以我只公开了那些函数。据我所知,回调参数函数可以包含对
timer
或
speed
的引用,但它们不会引用我试图屏蔽的
speed
和
timer
变量,因为回调函数将在另一个作用域中声明,因此它无法访问该作用域。即便如此,如果您想要绝对确定,您总是可以这样做:
var access = (function(timer)
{
var speed = 100,
begin = function(callback, interval)
{
speed = +(interval) || speed;
timer = (function(timer, speed)
{
return setInterval(callback, speed);
}('abc', 'def'));
timer = setInterval(callback, speed);
},
stop = function()
{
clearInterval(timer);
};
return {start: start, stop: stop};
}());
.each()
。你可以写成$('tr','#my_table').click(function() { ... });
。 - nnnnnn