Javascript js:var声明、循环、效率、实用性
除了可读性。。。 就效率和/或功能而言,我不清楚将声明放在循环之外(我的实践)还是放在循环之内(见其他SO帖子)之间的区别。或者就这一点而言,为什么要使用代码声明呢?这里有一些退化的例子。。。更多评论如下 A1: C2: 除了可读性。。。 我怀疑B1和B2之间以及C1和C2之间没有区别,但我怀疑A1和A2之间的效率或功能差异。此外,除了在函数中使用声明来消除(?)可能与同名全局变量的冲突外,我不确定声明还有什么好处 编辑:添加了几个分号 编辑:第一句话清晰,将功能更改为功能 编辑:在下面添加一些代码,以帮助我在下面发表评论 编辑:评论Javascript js:var声明、循环、效率、实用性,javascript,performance,variables,declaration,utility,Javascript,Performance,Variables,Declaration,Utility,除了可读性。。。 就效率和/或功能而言,我不清楚将声明放在循环之外(我的实践)还是放在循环之内(见其他SO帖子)之间的区别。或者就这一点而言,为什么要使用代码声明呢?这里有一些退化的例子。。。更多评论如下 A1: C2: 除了可读性。。。 我怀疑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>
var w=(函数(){//wrapper
警报('init');
函数p(){//private
警报(‘p’);
w、 b();//需要前缀
}
返回{
a:函数(){//public
警报(“a”);
p();
w、 b();//需要前缀
},
b:函数(){//public
警报(“b”);
}
};
})(); // 立即执行
车窗。空载=水渍;
警报序列将为“初始化”“a”“p”“b”
变量声明被提升到函数的顶部。这不会有任何区别,当然,除非您正在谈论在新函数范围中声明变量
EDIT:起初没有注意到,您的第一个示例没有用
var
声明i
。这不是好的做法
编辑: 通常,避免创建全局变量是一个好主意,以避免与可能设置全局变量的其他脚本发生冲突 每当您使用变量而不使用
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
变量时不使用var
,它将自动成为全局变量。我将更新这个示例,并添加另一个函数范围来说明
(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不允许一些糟糕的编码实践代码>。现在没有多少浏览器实现了严格模式
,但偶尔在一个这样的浏览器中测试代码会很有帮助
。严格模式位于底部。您将看到Firefox4支持它
下面是一个例子:
(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 );
(函数(窗口,未定义){
“严格模式”;//当使用var
时,javascript变量的范围与整个函数共享,因此当A1和A2都在一个函数中时,它们之间不会有任何区别
但是,您可以使用let
关键字并将变量范围限制为一个块,例如:
for(let x = 0; x < 10; x++){}
for(设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]();
}
var arr=[];
对于(vari=0;i来说,这只是语法上的差异。我认为即使在B,两个声明也在同一个范围内
仅声明不带var的i将导致在全局范围内定义它
这主要是关于什么选项最适合这种情况,而它仍然应该尽可能保持一致
如果你已经有了一个全局变量x,我认为这一切都不能防止冲突。还有一个类似的SO问题,我只是忘了在这里链接:let
并不是广泛可用的,也不是任何当前标准的一部分,尽管它应该在下一个版本的ECMAScript中出现。@patrick-以下是正确的吗?suppose x在某些函数中没有声明。js编译器将首先查看x是否存在于更广泛的命名空间中。如果在更广泛的命名空间中找到,则编译器将x实现为找到的x。另一方面,如果在更广泛的命名空间中找不到,则编译器将x指定为函数名称中的新变量空格?@mike:不。首先,准确地说,我们应该将其称为作用域而不是名称空间。变量作用域是在函数中创建的,函数可以嵌套。还有默认的全局作用域。如果在当前函数作用域中声明了x
,则将使用它。如果没有声明,则将搜索外部作用域以查看是否有been已声明。如果未在任何作用域中声明该变量,则该变量将添加到全局作用域,而不是当前函数。因此,仔细定义声明变量的作用域是非常重要的
<!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>
(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
(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
(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
(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 );
for(let x = 0; x < 10; x++){}
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]();
}