我对 JavaScript 中词汇范围概念的确切含义有以下疑问。
因此,根据我的理解,可以通过以下方式解释:
void fun()
{
int x = 5;
void fun2()
{
printf("%d", x);
}
}
显示任何内部级别都可以访问其外部级别变量。
词汇范围的概念是什么?如果是,为什么它被命名为 lxical ?究竟意味着什么?
答案 0 :(得分:1)
即使您发布的代码不是JavaScript,您也基本上是正确的。 function () { … }
创建范围,»内部范围«可以从»外«
var a = 10, b = 20;
(function () {
var b = 100;
console.log(a); //10
console.log(b); //100
(function() {
var c = 333;
})();
console.log(c) //undefined
})();
值得注意的是,范围(函数在其中定义)随函数一起保存。这意味着:
function A (a) {
var b = 100;
return function (c) {
console.log(a, b, c);
}
}
var afx = A(10);
afx(666); //10, 100, 666;
但是,Javascript不提供blockcope。所以:
for (var i = 0; i < 10; i++) { … }
console.log(i) //9
变量没有“作用于”块。
但 ES6和新关键字let
,要定义变量,请更改此设置。所以:
for (let i = 0; i < 10; i++) { … }
console.log(i); // ReferenceError: i is not defined (using babel to transpile)
因此,在JS的未来版本中,Blockscoping也可以这样:
{
let i = '#';
console.log(i); //#
}
console.log(i); // ReferenceError: i is not defined
答案 1 :(得分:0)
词法范围独立于执行上下文,就像您的示例一样。
动态范围取决于执行函数的上下文:
this.word = 'hello';
function saySomething() {
console.log(this.word);
}
saySomething(); // "hello"
var otherContext = {
word : "bye"
}
saySomething.call(otherContext); // "bye"