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
初始化表达式的一部分。除非表达式中涉及的变量在某处声明,否则它们将是隐式全局变量。如果你开始使用“严格”模式,事情对你来说就不会那么混乱了。