我对JavaScript中的作用域(主要是词法作用域)的确切工作方式有些困惑。我理解全局作用域中的变量可以在任何地方访问,在JavaScript中创建新作用域的唯一方法是创建函数(或在ES6中使用let )。然而,我并不真正理解什么是词法范围/意思。我在网上到处找遍了,找不到明确的解释。
我觉得我已经开始理解它了,但是让我和你确认一下,JavaScript巫师,以确保我是正确的。
因此,根据我的理解,词法作用域意味着静态作用域,因此,例如,函数的作用域不是由调用的位置创建的,而是由函数本身创建的位置创建的。下面的代码演示了这个概念:
var x = "global";
fun
我注意到一些语言,如C、C++、Java、Perl和.NET Visual都有“块”作用域,这意味着变量将只定义在它所声明的特定代码块中。
例如,
(C++):
if (true) {
int x = 1;
}
std::cout << x << std::endl;
此代码将无法编译,因为x仅在if语句创建的块作用域中可见。
错误:“X”未在此范围内声明
但是,像VBA、Python和Javascript这样的语言都有“基于函数”的作用域,这意味着创建新范围的唯一时间是定义新函数时。
例如,
(VBA):
If True Then
Dim x As
在JavaScript中,函数总是可以访问全局变量。我有一个正在使用的类,它引用了全局变量。下面是一个类似的类:
function Test(){
this.abc = abc;
}
如果我设置了全局abc,然后调用它,它就能工作。
var abc = 123,
testA = new Test;
console.log(testA.abc); // 123
但是,如果我不希望abc是全球性的呢?我将代码包装在一个函数调用中,但我得到了一个错误,声明为abc is not defined。
(function(){
var abc = 123,
tes
我已经学习javascript语法大约一个星期了。
如何将变量从一个本地作用域移动到另一个本地作用域?例如,我在屏幕上创建了一个for循环,它在循环的每一轮都向一个主数组添加一个值数组,主数组称为x。我没有包含这个循环,因为它与问题无关。在下面的示例中,变量y离开屏幕的目的本质上是获取x数组中包含的值,以便通过web擦拭来检索更多数据。
除了上下文之外,我无法访问if语句中声明的y变量。正如您在下面看到的,我试图在一个名为functionName的函数中使用它作为参数。
if (x.length === 1){
let y = x[0]
} else {
let y = x[
我正在尝试理解Javascript如何处理当前作用域的子块中let变量的重新声明。
由let声明的变量在为其定义的块以及任何包含的子块中都有其作用域。
如果我们尝试这样做,它会像预期的那样正常工作:
function letTest() {
let x = 1;
for(var i = 0; i < 1; i++) {
console.log(x); // logs - 1
}
}
另一个例子。现在,我使用for子块为0的let变量分配一个新值,并执行for循环。这也和预期的一样。
function letTest() {
let x = 5;
con
给出下面的代码示例,变量currOn似乎是在循环之外启动的,并且只实例化了一次。例如,假设itemList中有三项,在第二次迭代中,SomeFunctionThatDoesSomeStuff返回true。然后,currOn的值将是true。在第三次迭代中,我认为给定的VB.NET是一种块作用域语言,currOn将被重新实例化并默认为false;然而,我看到它仍然是true,因此不管sOn的值如何,都不会在以后的迭代中得到更新。它看起来像是javascript的函数作用域,其中currOn的声明将被拉到循环之外。有人知道这是怎么回事吗?
For Each item As MyIt
我被教导要在顶部定义变量,无论它们在代码中的位置如何,因为这是JavaScript解释事物的方式。所以,我的理解是:
var foo = "Bob";
if (2 + 2 === 4) {
var car = "Blah";
}
将被解释为:
var foo = "Bob",
car;
if (2 + 2 === 4) {
car = "Blah";
}
我的理解正确吗?我总是试图将变量定义放在当前作用域的顶部,但有时这些变量只需要在if语句中使用,所以在外部定义它们似乎有点奇怪--这仍然是最佳实践吗?
我看到在作用域内定义变量是可能的,但是在该作用域之外引用它。例如,下面的代码可以工作:
if condition:
x = 5
else:
x = 10
print x
然而,这让我觉得有点奇怪。如果您尝试在C中执行此操作,变量X的作用域将不正确:
if(condition) { int x = 5; }
else { int x = 10; }
print x; // Doesn't work: x is unavailable!
无论如何,在C中的解决方案是首先声明X,然后弄清楚如何处理它:
int x;
if(condition) { x = 5; }
else
我对为什么这段代码不起作用感到有点困惑:
def create(type)
Module.new do
def foo
type
end
end
end
在对返回的模块调用foo时,未定义type。我应该使用Proc或lambda来捕获create方法中的作用域吗?
(我最近可能做了太多JavaScript了)
tl;dr
如何使用在创建时使用可用变量的方法在运行时创建模块?
我刚刚将一个应用程序从Rails 3.2.8升级到Rails 4.0.2,并且我发现一个定义了"default_scope“的模型有一个奇怪的行为。
问题是它似乎“无作用域”()在Rails 4中不能像在Rails 3中那样工作。
当我尝试将"unscoped“与另一个"scope”链接起来时,问题就出现了。在Rails3中,它工作得很好,首先删除默认作用域,然后应用第二个作用域。在Rails 4中,它总是添加默认作用域。
我有一个这样定义的模型:
class User < ActiveRecord::Base
......
# set a defau
我昨天看了这个:,我一直在想如何改进我的javascript。在重写一个在firefox中看起来非常起伏的动画时,我正在努力记住他说的每一句话。
我想知道的一件事是,for循环是否会添加到作用域链中。Zakas谈了很多关于闭包如何添加到作用域链上,以及访问局部作用域之外的变量往往需要更长的时间。使用for循环,既然您可以在第一个语句中声明一个变量,这是否意味着它正在向链中添加另一个作用域?我认为不会,因为扎卡斯也说过do-while、while和for循环之间没有区别,但看起来还是会有区别。
我问这个问题的部分原因是,我经常在JS库中看到这样的代码:
function foo(){
v
在使用let和es6之前,如何在javascript中进行块作用域?我有一个函数需要向后兼容,但遇到了很多棘手的问题:
基本上就是这样
for(let command in commands){
// do something with the command
}
我想模仿一下没有let的功能。我意识到在时间上倒退有点愚蠢,但我认为这是阻力最小的道路。
我知道(或者我认为我知道) JavaScript中的作用域是如何工作的,所以我认为这是不可能的,但是:在类实例中是否有一种方法可以访问块(函数)作用域变量?
class Test {
run() {
const running = true;
}
}
const test = new Test();
test.run();
console.log(?) -> here I would like to get info that `running` variable was created
我无法在Test类中创建另一个函数。我刚拿到了那个例子。
FYI:我试图解决的问
我见过下面的链接和答案,但我很困惑.
var color = "black";
var r = function (x, y) {
if(y == 1){
var color = "red"; //refers to local color, here color points to red color in memory
} else {
console.log('inside else block');
color = "red color";//refers
JS 似乎不允许声明隐式全局,但不影响对在条件(if)或循环(while)中定义的变量的访问。在中,您不能访问外部在条件或循环中声明的变量。然而,在JavaScript中,以下工作:
"use strict";
(function() {
var mybool = true;
if (mybool) {
var test = "test;
console.log(test); //"test"
我今天碰巧遇到了一个JavaScript,它看起来像这样:
var x = "abc";
var y = true;
if (y) {
var x = "xyz";
}
alert(x);
作为一名Perl开发人员,这看起来像是一个bug,因为x在更紧的范围内被重新声明,并且分配的值应该丢失。然而,在测试中,代码似乎像预期的那样工作。
如果像这样重新声明变量,那么是否忽略了var并维护了原来的作用域?
我看到很多人(包括我在内)都在为此而苦苦挣扎。我猜这主要是因为不完全了解Javascript作用域是如何工作的。
图像幻灯片就是一个很好的例子。假设你有一系列的图像,第一个是淡入,等待,=>,=>,淡出,=>,next,image。
当我第一次创建这个的时候,我已经有点迷茫了。我认为创建基础的最大问题是保持它的整洁。我注意到使用回调可能会变得非常快。
所以更复杂的是,大多数幻灯片都有控制按钮。下一步,上一步,转到img,暂停,...
我已经尝试了一段时间了,这就是我得到的:
$(InitSlideshow);
function InitSlideshow() {
v
我的例子有 let resort30 = new Resort('Alta'); 在文件的顶部,然后在测试用例中使用它。 let alta = new Visit(resort30, '03/01/2000'); // Note this is before any describe 这是可行的。但是,如果我在describe中创建一个before或beforeEach,并且在所有it之前使用: before(function () {
let resort30 = new Resort('Alta');
}); 并注释掉原始声明,则无法识