我有下面的Perl代码。
use warnings;
use strict;
my $x = "global\n";
sub a {
print $x;
}
sub b {
local $x = "local\n";
a();
}
a();
b();
a();
即使$x在b()子例程中有作用域,为什么Perl不允许将其本地化?
function one() {
function two() {
alert(i);
}
return two;
}
(function() {
var i = 3;
var f = one();
f(); // Uncaught ReferenceError: i is not defined
}());
我读过的文章说,当一个函数被调用时,一个新的执行上下文被添加到堆栈中,作用域链是通过遍历堆栈来创建的。但在上面的代码中,这肯定会导致3被警告?
它是如何计算出作用域链的?
我对JavaScript中的作用域(主要是词法作用域)的确切工作方式有些困惑。我理解全局作用域中的变量可以在任何地方访问,在JavaScript中创建新作用域的唯一方法是创建函数(或在ES6中使用let )。然而,我并不真正理解什么是词法范围/意思。我在网上到处找遍了,找不到明确的解释。
我觉得我已经开始理解它了,但是让我和你确认一下,JavaScript巫师,以确保我是正确的。
因此,根据我的理解,词法作用域意味着静态作用域,因此,例如,函数的作用域不是由调用的位置创建的,而是由函数本身创建的位置创建的。下面的代码演示了这个概念:
var x = "global";
fun
我正在尝试执行一些Python3源代码中的作用域分析,并且我被非本地语句在类定义中的工作方式所困扰。
据我所知,类定义在一个新的命名空间中执行它的主体(称为dict),并将类名绑定到type( name,base,dict)的结果。只要非局部x引用的变量被绑定在封闭的非局部作用域中的某处,它就应该起作用。
因此,我希望编译并运行以下代码:
class A:
v = 1
class B:
nonlocal v
v = 2
但这失败了,因为
SyntaxError: no binding for nonlocal 'v' found
我得到了这个错误:
Apparent variable 'b' was found in a static scope but doesn't refer to a local variable, static field or class. Possible causes:
You attempted to reference a variable in the binding or an instance variable from a static context.
You misspelled a classname or statically imported
考虑以下代码:
function nepaliBuddha() {
var a = 20;
return function buddhaNepal() {
console.log(a);
}
}
var closure = nepaliBuddha();
closure(); // logs 20
现在,当我们调用closure时,输出是20。这证明了内部作用域属性([[scope]])是分配给定义它的内部函数的,或者说,当declared.If在声明时没有分配时,就无法在不同的上下文中调用它时记录20。
调用closure()时,函数上
function f() { return s; } // works fine though no `s` is defined yet !
var s=1;
f(); // 1
delete s;
var s=2;
f(); // 2
(function() {
var s=3;
f(); // 2 and not 3 which means lexical scoping is at play (?)
})();
首先,您可以关闭一个尚未定义的变量(s)。如果使用词法(静态)作用域,这是如何实现的?
第二,删除原s后,f()可以找到新的s。这是否意味着闭包绑定到变量名,而不是引
我有一个在另一个文件中定义的对象,我无法编辑该对象。我需要调用在其中定义的函数,但没有将其设置为方法。我的测试不工作,因为我的作用域中不存在callMe。
// Example
function ObjectCreator()
{
this.name = "I am an object";
var callMe = function()
{
console.log("You did it");
}
this.DontCallMe = function()
{
console.l
我试图了解Javascript中的词汇范围是如何工作的,所以我尝试了下面的例子。在我的第一个示例中,我在Main()中调用Test(),并且正如预期的那样,它给出的错误" bar“是未定义的,类似地,在第二个示例中,我在Main()中调用setTimeout,但同样(SetTimeout),它是如何获得bar值的函数,因为Javascript具有词法作用域而不是动态。
我对此感到困惑!
//Example No 1 without using setTimeout()
function Main()
{
var bar = "Main";
Test();
考虑以下JavaScript中的阴影示例:
let a = 99;
{
var a = 10;
let b = 11;
const c = 200;
console.log(a);
}
console.log(a);
在这里,我得到以下错误:
SyntaxError: Identifier 'a' h
我读过关于JavaScript闭包的超级帖子,在我找到的答案之间似乎有一些出入,我希望我能得到一些进一步的澄清。
线程中的一些答案是在内部函数引用外部函数的变量时创建闭包的。
我找到了另一个答案,说这是一个终结:
var a = 42;
function b() { return a; }
注意,这里没有内部/外部函数,而只是一个函数。person给出的解释是,闭包是函数引用外部作用域的时候。
所以我的问题是,只有当有两个函数(内函数和外部函数),或者函数引用外部作用域时才创建闭包,而外部作用域可能是函数,也可能不是函数(在本例中,它只是顶级作用域)?
下面返回1,指示创建了一个local x。
x = 1
bar() = (x = 2)
bar() # 2
x # 1
这将返回5,指示这两个x引用全局x。
x = 1
for i = 1:5
x = i
end
x # 5
引用示例:这次for循环无法更新全局。
x = 10
function foo(n)
for i = 1:n
x = i
end
1
end
foo(2), x # 1, 10
更新
来自@matt的链接非常有用。这实际上是软范围和硬范围的结果,。总之,函数作用域用于像循环作用域一样工作,直到随着软作用域&硬作用域的引入而发生中断更改
我遇到了这个问题,我希望一个函数可以从外部访问,但它也需要继承一些基于作用域的属性,因为它在JSON.stringify()中作为一个可选的字符串符使用,所以不能有额外的上下文传递给它。
假设我有这样的代码
let object = {
function1(){
let a = 1
console.log(object.function2()) // a is not defined undefined
},
function2(){ return a }
}
所以我想知道是否有一种方法可以改变function2的闭包/作用域状态,比如绑定一个新的this上下文,
我正在看这个,当我在玩的时候,我发现了这个:
#! /usr/bin/env perl
#
# use warnings;
use strict;
use feature qw(say);
{
our $foo = "bar";
say "Foo = $foo";
}
say "Foo = $foo"; # This is line #12
是的,我确实把use warnings;关掉了.
当我运行这个时,我得到:
Variable "$foo" is not imported at ./test.pl li