Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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 功能范围理解不清_Javascript - Fatal编程技术网

Javascript 功能范围理解不清

Javascript 功能范围理解不清,javascript,Javascript,1的输出是如何显示的?这是什么意思 var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 在函数体执行?中,在函数的最后一行声明一个符号“a”。这是受赋值语句影响的“a” 函数声明语句被提升到函数顶部,并首先进行解释。因此,赋值语句实际上是在您声明了一个名为“a”的函数(b”函数的本地函数)之后发生的。因此,赋值将影响该符号,而不是全局“a” 请记住,变量不是类型化的,因此,

1的输出是如何显示的?这是什么意思

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
alert(a);
在函数体执行?

中,在函数的最后一行声明一个符号“a”。这是受赋值语句影响的“a”

函数声明语句被提升到函数顶部,并首先进行解释。因此,赋值语句实际上是在您声明了一个名为“a”的函数(b”函数的本地函数)之后发生的。因此,赋值将影响该符号,而不是全局“a”


请记住,变量不是类型化的,因此,将名称绑定到函数并不妨碍以后为其分配数值。

您编写的代码具有误导性,并且其风格使人们认为执行顺序很重要。现在的标准JavaScript引擎将在运行之前将其转换为:

return;
function a() {}
现在你可以了解实际发生了什么。“a”在函数“b”中再次声明,因此现在实际上有两个“a”变量。一个是“window.a”,另一个是“bvara”,但不是“b.a”,因为它在闭包或函数之外是不可访问的

换句话说,你得到了你的代码


请让您的代码可读,不要混淆要点。

Wow。这是一个很好的例子,说明了javascript可爱的灵活性,如果你不注意如何编写它,它会给你带来麻烦。是的!JavaScript表面上的简单化使它变得复杂:-)对不起,尖头,你的回答和我一样。我没有注意到你的答案,但为了清楚起见,我会保留我的答案+先生,我想这本书的要点是,你应该把代码写得好像它已经被解析过一样。它将提高可读性。Douglas Crockford是一个值得学习的人。@emeraldcode.com我个人同意,但是有些人喜欢分解代码,以便您可以在顶部看到和阅读函数的“精华”,所有子部分都在后面。这种风格正是JavaScript(我认为)试图促进的。就我个人而言,我在那天学会了用Pascal编写代码,而你必须以完全相反的方式来做事情:-)@pointy->这确实是一个很好的学习工具,所以他把代码放在那里很好。还有一个阵营是道格拉斯·克罗克福德式的,一切都很好。我倾向于只希望代码能够正常工作,并且作为主要内容具有可读性。我也学会了用Pascal编写代码,但我似乎采用了一种稍微混合的风格,先声明东西,后声明东西。在函数中,我更喜欢先声明变量,然后声明任何局部函数,然后是函数的主体。我认为这对我来说是可行的,因为它使局部函数可以访问这些局部变量变得很明显。但是,如果我有一个“main”函数或一段主要的全局代码,我会把它放在其余函数之前,但是放在任何全局变量声明之后(尽管我尽量减少全局变量的使用)。
var a = 1,
b = function() {
    var a = function() {};
    a = 10;
    return;
};
b();
alert(a);