Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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的函数中变量的范围 为什么y会泄漏到函数之外,因为JavaScript中的作用域绑定到函数_Javascript_Scope - Fatal编程技术网

使用javascript的函数中变量的范围 为什么y会泄漏到函数之外,因为JavaScript中的作用域绑定到函数

使用javascript的函数中变量的范围 为什么y会泄漏到函数之外,因为JavaScript中的作用域绑定到函数,javascript,scope,Javascript,Scope,详细的解释将是富有成效的 var x = 0; function f(){ var x = y = 1; // x is declared locally. y is not! }; f(); console.log(x, y); // 0, 1 y变量是全局变量的原因是,在Javascript中,如果从赋值语句中省略var关键字,则赋值给的变量将在全局对象上声明 这意味着如果以这种方式编写f()函数,用var关键字声明x和y: function f(){ var x,

详细的解释将是富有成效的

var x = 0;
function f(){
   var x = y = 1; // x is declared locally. y is not!
    };
f();
console.log(x, y); // 0, 1

y变量是全局变量的原因是,在Javascript中,如果从赋值语句中省略
var
关键字,则赋值给的变量将在全局对象上声明

这意味着如果以这种方式编写f()函数,用
var
关键字声明x和y:

function f(){
    var x, y;
    x = y = 1;
};
那么x和y都是局部变量(局部x隐藏全局变量)

分配变量而不声明它(使用var关键字)是一种不好的做法。 JS的新版本将在这方面抛出一个错误。您可以使用EC5的严格模式来利用此行为:

所以你可以这样写你的函数:

 function f(){
        'use strict'
        var x, y;
        x = y = 1;
    };
现在,如果您忘记声明y,您会收到一个错误,它会对您大喊大叫。

这只是语法错误。 行
var x=y=1表示:

  • 声明局部变量x
  • y=1
  • 声明全局变量y(因为它未声明)
  • x=y 替换

    var x = y = 1;
    

    你会得到局部变量y


    有什么需要解释的。X不在全局范围内(至少是您在函数中使用的范围)。Y在全局范围内。换句话说,您可以声明变量(var x,Y;),然后使用它们,或者使用逗号通过赋值(var x=1,Y=1;)进行声明,但行var x=Y=1;解释器理解为4个动作,1)局部变量x 2)创建全局变量y(因为它没有声明)3)x=y 4)y=1var x=y=1;等于代码-var x;y=1;x=y;您应该编辑第一条注释,因为它是错误的(语句求值的顺序),而不是第二条注释(正确的顺序)。现在的方式(两个不同的评论,第一个是有问题的)可能会令人困惑。。。
    var x = 1, y = 1;
    
    var x = 1;
    var y = 1;