JS:VaR 声明、循环、效率、效用
js: var declarations, loops, efficiency, utility
>可读性除外...在效率和/或功能方面,我不清楚将声明放在外部(我的实践)或循环内部(在其他 SO 帖子中看到)之间的区别。或者就此而言,为什么要进行代码声明? 这里有一些堕落的例子...更多评论如下。
答1:
var x;
for (i=0; i<10; i++){
x = i;
}
答2:
for (i=0; i<10; i++){
var x = i;
}
B1:
var i;
for (i=0; i<10; i++){
}
B2:
for (var i=0; i<10; i++){
}
C1:
var x;
var y;
C2:
var x, y;
除了可读性...我怀疑B1和B2之间以及C1和C2之间没有区别,但对A1和A2之间的效率或功能差异持怀疑态度。另外,我不确定声明除了在函数中使用声明来消除(?)与同名全局变量的可能冲突之外,声明有什么优点。
编辑:添加了几个分号
编辑:第一句话清晰,功能更改为功能
编辑:在下面添加一些代码以帮助我在下面发表的评论编辑:评论
<!doctype html>
<html>
<head>
<script type='text/javascript'>
var w = (function(){ // wrapper
alert('init');
function p(){ // private
alert('p');
w.b(); //needs prefix
}
return{
a: function(){ // public
alert('a');
p();
w.b(); // needs prefix
},
b: function(){ // public
alert('b');
}
};
})(); // execute immediately
</script>
<script type="text/javascript">window.onload=w.a;</script>
</head>
<body>
sequence of alerts will be 'init' 'a' 'p' 'b'
</body>
</html>
变量声明被提升到函数的顶部。这不会有任何区别,当然,除非你谈论的是在新函数作用域中声明一个变量。
编辑:起初没有注意到,您的第一个示例没有声明i
与var
。这不是好的做法。
编辑:
通常,最好避免创建全局变量,以避免与可能设置全局的其他脚本发生冲突。
每当您使用变量而不用 var
声明它时,它就会变成全局变量。
JavaScript 中创建新变量作用域的唯一方法是在函数的主体中。函数可以相互嵌套,从而创建一个范围链,该链从最里面的函数开始,到全局作用域结束。
因此,通常将所有代码放在立即调用的函数中。这样,您使用var
创建的任何变量都不会最终成为全局变量。
(function() { // <-- create a function
// place your code in here
// use "var" when declaring variables so they don't become global
var name = "patrick dw";
alert( name );
})(); // <-- invoke the function immediately so your code runs
在前面的示例中,name
变量将是立即调用的函数的本地变量,并且不会污染全局范围。
由于遍历变量范围需要一些资源,因此人们通常会通过传入一些参数来调用该函数,例如 window
。
(function( window, undefined ) {
// now the window object is referenced locally. Better for performance.
var name = "patrick dw";
alert( name );
})( window ); // <-- invoke the function passing in the global "window" object
现在,window
对象在函数内部本地引用,因此,如果您访问 window
的某些属性,它不必一直遵循函数外部的作用域链。
我还在函数中包含一个额外的undefined
参数,但没有向其传递参数。这是为了避免一些不良编码实践带来的奇怪问题。但这是另一个问题。
现在使用相同的函数,如果我们不使用var
来声明我们的name
变量,它将自动成为全局变量。我将更新该示例,并添加另一个函数作用域来说明。
(function( window, undefined ) {
// create a function
function some_func() {
name = "patrick dw"; // didn't use "var" when declaring!!
alert( name );
}
some_func(); // call our function
alert( window.name ); // but "name" is also accessible from the global window
})( window );
alert( name ); // outside those functions, we're global, and again we can see that
// the "name" variable is accessible
所以正如你所看到的,我们从来没有声明过var name
,所以它变成了一个自动全局变量,即使它嵌套了两个函数深度。
这是许多错误的根源,也是您需要格外小心使用的原因 var
.
最后,我要指出的是,ECMAScript 5 不允许在 "strict mode";
中运行代码时进行一些不良的编码实践。现在没有多少浏览器实现strict mode
,但每隔一段时间就测试你的代码会很有帮助。
下面是 ECMAScript 5 的兼容性表。严格模式位于底部。你会看到Firefox 4支持它。
下面是一个示例:
(function( window, undefined ) {
"strict mode"; // <-- use the strict mode directive
name = "patrick dw"; // In Firefox 4, you should get a ReferenceError in the console
// because "name" was never declared with "var"
})( window );
它只是语法差异。我认为即使在 B 中,这两个声明也在同一范围内。
仅声明 i 而不使用 var 将导致它在全局范围内定义。
这主要是关于哪种选择最适合情况,同时仍应尽可能保持一致。
如果你已经有一个全局变量x,我认为这些都不能防止碰撞。
使用 var
时,javascript 变量的作用域与整个函数共享,因此当 A1 和 A2 都在一个函数中时,它们之间不会有任何区别。
但是,您可以使用 let
关键字并将变量范围限制为块,例如:
for(let x = 0; x < 10; x++){}
这将限制x
变量仅在 for{} 块内具有范围。
A1 或 A2 之间也没有功能或效率差异。试试这个:
var arr=[];
for(var i=0; i<10; ++i) {
var x=i;
arr.push( function() {alert(x);} );
}
for(var i=0; i<10; ++i) {
arr[i]();
}
您将看到所有函数显示的值都相同,因为它与所有函数使用的 x 相同。不是每次都创建新变量。
- jQuery:循环一个具有不同超时值的循环
- 在循环中分配json值时,值被覆盖
- 如何在下面的ES6循环中获得前面的文本
- 为什么“;未定义的“;在JavaScript中结束循环
- Javascript循环不会自我更新
- 如何使用jquery处理php循环通过元素
- 而循环只设置php中输入字段中的第一个值
- 循环遍历数组中的特定索引
- Javascript返回值只在循环中返回一次
- 按照选项卡索引的顺序循环一个jQuery选择
- 循环遍历以数组为值的Javascript对象
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 循环结束/推送到数组之前在页面上呈现EJS
- 循环比赛位置算法
- jQuery循环在特定位置暂停
- 我的javascript for循环不起作用
- 循环浏览多个身体背景图像
- W3C循环样式的JavaScript
- JS:VaR 声明、循环、效率、效用