Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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 这里的变量a如何具有局部作用域及其始终返回的窗口对象(通过该关键字指向)_Javascript_Html_Ecmascript 6 - Fatal编程技术网

Javascript 这里的变量a如何具有局部作用域及其始终返回的窗口对象(通过该关键字指向)

Javascript 这里的变量a如何具有局部作用域及其始终返回的窗口对象(通过该关键字指向),javascript,html,ecmascript-6,Javascript,Html,Ecmascript 6,我问了一个关于以下代码的问题: var b=函数a(){};b() 参考: 我说下面的代码应该给出错误,因为这是无效代码。函数只有两种定义方法-函数a(){}或var a=function(){}。所以上面的代码是无效的,应该给出错误 一位朋友回答说上面的代码是有效的,A具有本地范围。现在,我尝试了各种代码,但是a总是返回全局范围。如果他说,a有局部作用域是真的,那么如何找到该局部作用域,就像这个关键字应该并且总是返回局部作用域或指向某个对象那样 问题是它总是返回窗口对象,所以他(我的朋友)错了

我问了一个关于以下代码的问题:

var b=函数a(){};b()

参考:

我说下面的代码应该给出错误,因为这是无效代码。函数只有两种定义方法-
函数a(){}
var a=function(){}
。所以上面的代码是无效的,应该给出错误

一位朋友回答说上面的代码是有效的,
A
具有本地范围。现在,我尝试了各种代码,但是
a
总是返回全局范围。如果他说,
a有局部作用域
是真的,那么如何找到该局部作用域,就像
这个关键字
应该并且总是返回局部作用域或指向某个对象那样

问题是它总是返回
窗口对象
,所以他(我的朋友)错了。请解释或帮助

我试过:

var b=function a(){console.log(this);}b()

var b=(函数a(){console.log(this);})()

结果:


这里有两个完全独立的概念:

在函数中所指的内容
  • 可引用标识符
    a
    的范围
  • 您的回答是正确的,
    指的是当一个普通的、未绑定的、非箭头函数不是对象的一部分时调用的窗口,如
    b()

    您的朋友是正确的,因为标识符
    a
    只能在函数内部引用-它不是全局变量,而是函数的局部变量。见:

    console.log(a型);
    var b=函数a(){
    控制台日志(a型);
    }
    
    b()这个
    引用了全局
    窗口
    对象吗?@Yousaf-是的,如果它是函数本身命名的局部对象。我想你把
    这个
    a
    是函数的名称,它仅在函数体中可用,而此函数中的
    this
    的值取决于您如何调用它。由于您将其作为函数调用,因此在非严格模式下,
    将引用全局
    窗口
    对象;控制台日志(d)给出d的错误,这是正常的。然后,
    var c=d=10;控制台日志(d)为d给出10。为什么?它还应该为
    d
    抛出错误,因为d是c的右侧;
    d
    的分配和范围现在如何在RAM中工作?这是否意味着最右撇子的东西不会被分配内存,其余的都会被分配?在第二种情况下,d如何神奇地变成了
    全局范围
    ?在注释中的第二个代码中,您隐式地创建了一个全局变量,其右侧为
    d=10
    ,在赋值结果也赋值给
    c
    之前,它首先运行。在第一个代码中,当不存在这样的变量时,引用
    d
    。赋值运算符的优先级是从右到左。好的,所以只有在“=”(赋值运算符)为
    d
    创建全局变量的情况下才会发生奇迹?意思是如果我写
    函数alpha(){var e=d=c=b=a=99}
    ,那么
    d,c,b,a将具有全局作用域,并且因为我在e前面使用了var,所以
    e
    仅具有局部作用域?@Deadpool是的,这是正确的。第一个
    =
    右侧的所有内容都是局部变量
    a
    初始化表达式的一部分。除非表达式中涉及的变量在某处声明,否则它们将是隐式全局变量。如果你开始使用“严格”模式,事情对你来说就不会那么混乱了。