浅析四种多见的Javascript声明循环变量的书写方式
这篇文章主要先容了四种多见的声明循环变量的书写方式,关于其举办庞杂的阐发和有点,必要的网友可以参考下
Javascript中的循环变量声明,终究应该放正在哪儿?
习惯1:不声明间接运用
function loop(arr) {
for (i = 0; i < arr.length; i++) {
// do something
}
}
很是惊险的运用风不雅,个别环境下轮回变量将成为window关于象上的一个属性被全局运用,极有大约影响次序的个别逻辑实现。
必要着重提一下的是,正在strict情势下,未声明变量而间接赋值的运用方式会间接抛出正常,早就该这么做啦!援用一下ecma-262标准附录C中的一段话:
"Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the global object. When a simple assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable Reference. If it does a ReferenceError exception is thrown (6.2.3.2)."
换言之,如果再运用未经声明的变量的话,ReferenceError正常会被抛出。
习惯2:放正在for轮回初始语句块中并频频声明
function loop(arr) {
for (var i = 0; i < arr.length; i++ ){
// do someting
}
// console.log(i);
for (var i = 0; i < arr.length; i++ ){
// do something else
}
}
这类方式看似最安全规范,不少从C和Java转到前端开发的同学都偏偏爱这样的写法,事实上,这大约是由于关于Javascript中一个重要概念有所误解造成的——变量作用域。区别于C和Java,Javascript其实不具备实在的块级功能域,也便是说,正在第一个轮回停滞之 后,console.log(i)其实不会打印undefined大约抛出ReferenceError正常,而是会个别打印出arr.length。
诚然,多么的写法诚然除了了难看之外意思不大,可是长久以来兼容性卓越且没有违抗任何规范——ecma标准中并无抑制正在某一个功能域内关于付对立变量的重复声明。
习惯3:正在函数顶部和其他变量一块儿汇合概念
function loop(arr) {
var var1;
var var2;
var i;
for (i = 0; i < arr.length; i++) {
// do something
}
}
这类c89-like式的变量概念方式正在Javascript中多少乎无可抉剔,既不会造成Javascript支持块级功能域的误解,又不会沾染全 局scope,还不违抗任何标准和规范,主要缺点便是循环变量的声明和轮回体大约会离隔有点远。正在不借助更多代码的条件下,除了了等待各大干流扫瞄器厂商实现ECMAScript 6中的let关头字之外,这个标题似乎找不到更好的搞定规划。
习惯4:将循环代码封装到IIFE中
function loop(arr) {
(function () {
for (var i = 0; i < arr.length; i++) {
// do something
}
})();
}
最后一种习惯是前端次序员们熟悉的IIFE(I妹妹ediately-Invoked Function Expression),即当即实施函数。此种方式的主要缺点是抄写绝关于麻烦,且有多余的机能消费(很小),但正在兼容性、关于各标准规范的遵照上示意卓越。 如果不嫌麻烦,开拓者可以采用这类方式。
以上便是关于Javascript中四种多见轮回变量概念抄写风不雅的庞杂先容和阐发,各无利弊,读者可以分别自己的须要择优运用。