gpt4 book ai didi

javascript - js : var declarations, 循环,效率,效用

转载 作者:行者123 更新时间:2023-11-29 10:23:52 28 4
gpt4 key购买 nike

抛开可读性...在效率和/或功能方面,我不清楚将声明放在外部(我的做法)或循环内部(在其他 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 和 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 声明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 变量将是立即调用的函数的局部变量,不会污染全局范围。

因为遍历变量作用域会占用一些资源,所以人们通常会在传递一些参数的情况下调用该函数,例如 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 不允许一些不良的编码做法。目前实现严格模式的浏览器并不多,但在实现的浏览器中经常测试您的代码会很有帮助。

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 );

关于javascript - js : var declarations, 循环,效率,效用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050433/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com