可读性除外...... 在效率和/或功能方面,我不清楚在我的实践之外或在循环内部(在其他SO帖子中看到)之间的区别。或者就此而言,为什么代码声明呢?这里有一些堕落的例子......下面有更多评论。
A1:
var x;
for (i=0; i<10; i++){
x = i;
}
A2:
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和amp;之间没有区别B2和C1之间C2,但我对A1和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>
答案 0 :(得分:3)
变量声明被提升到函数的顶部。它不会有任何区别,除非你在谈论在新的函数范围内声明一个变量。
编辑:最初没有注意到,您的第一个示例没有使用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
的原因。
最后,我注意到当您在"strict mode";
中运行代码时,ECMAScript 5不允许使用一些错误的编码做法。目前没有多少浏览器实现strict mode
,但是每隔一段时间就会对您的代码进行一次测试。
Here's a compatibility table for 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 );
答案 1 :(得分:1)
它只是语法差异。我认为即使在B,两个声明都在同一范围内。
只是声明没有var的i将导致它在全局范围内定义。
主要是关于什么选项最适合情况,尽管它应该尽可能保持一致。
如果你已经有一个全局变量x,我认为这不会阻止碰撞。
答案 2 :(得分:0)
使用var
时,javascript变量的范围与整个函数共享,因此当A1和A2都在函数中时,它们之间没有任何区别。
但是,您可以使用let
关键字并将变量范围限制为块,例如:
for(let x = 0; x < 10; x++){}
这将限制x
变量仅在for {}块中具有范围。
答案 3 :(得分:0)
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相同。每次都不会创建新变量。