Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js:var声明、循环、效率、实用性_Javascript_Performance_Variables_Declaration_Utility - Fatal编程技术网

Javascript js:var声明、循环、效率、实用性

Javascript js:var声明、循环、效率、实用性,javascript,performance,variables,declaration,utility,Javascript,Performance,Variables,Declaration,Utility,除了可读性。。。 就效率和/或功能而言,我不清楚将声明放在循环之外(我的实践)还是放在循环之内(见其他SO帖子)之间的区别。或者就这一点而言,为什么要使用代码声明呢?这里有一些退化的例子。。。更多评论如下 A1: C2: 除了可读性。。。 我怀疑B1和B2之间以及C1和C2之间没有区别,但我怀疑A1和A2之间的效率或功能差异。此外,除了在函数中使用声明来消除(?)可能与同名全局变量的冲突外,我不确定声明还有什么好处 编辑:添加了几个分号 编辑:第一句话清晰,将功能更改为功能 编辑:在下面添加一些

除了可读性。。。 就效率和/或功能而言,我不清楚将声明放在循环之外(我的实践)还是放在循环之内(见其他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]();
}