标签: scoping

Javascript:z = z || []不使用VAR时会抛出错误 - 为什么?

出于好奇的好奇心,为什么javascript会接受

var z = z || [];
Run Code Online (Sandbox Code Playgroud)

初始化z(因为z可能最初定义)

但没有var,它会抛出一个错误(在全球空间)

z = z || [];
Run Code Online (Sandbox Code Playgroud)

(如果z先前未定义)

在全球空间中,您不需要使用VAR,但我得到它可能是不好的做法.

在你说这是一个重复的问题之前

var关键字的用途是什么以及何时使用它(或省略它)?

注意声明"如果你在全球范围内那么没有区别."

显然,根据我的工作实例,这并非100%正确.

这是一个怪癖还是有合法的逻辑?


在我学会的时候添加答案摘要:

感谢蒂姆(见下文)我误解的关键是没有意识到这一点(javascript的基础)

var z; 如果z已经存在,则绝对没有

这就是这个表达式似乎有两种方式,如果你错误的假设"var z"总是初始化.

从左边开始,"var z"只是确保定义了z,但是如果已经存在,则实际上不会影响任何现有值.然后在右边,如果z已经存在,则使用它,否则,变量刚刚被声明(但是为空),因此它不会被使用但不会引发错误.

这是关于Javascript中这种范围和提升问题的优秀文章:http: //www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

非常感谢minitech和其他所有贡献者!

javascript var scoping operator-precedence hoisting

7
推荐指数
2
解决办法
232
查看次数

使用以编程方式构造的公式有任何陷阱吗?

我想要通过一长串潜在的解释变量,依次回归每个反应变量.而不是粘贴模型公式,我正在考虑使用reformulate(), 如此处所示.

fun()下面的功能似乎完成了工作,适合所需的模型.但请注意,它在其call元素中记录了构造的公式对象的名称而不是其.

## (1) Function using programmatically constructed formula
fun <- function(XX) {
    ff <- reformulate(response="mpg", termlabels=XX)
    lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
# 
# Call:
# lm(formula = ff, data = mtcars)                 <<<--- Note recorded call
# 
# Coefficients:
# (Intercept)          cyl         disp  
#    34.66099     -1.58728     -0.02058  

## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
# 
# Call:
# lm(formula = …
Run Code Online (Sandbox Code Playgroud)

r scoping

7
推荐指数
1
解决办法
419
查看次数

R Shiny中的环境

http://shiny.rstudio.com/articles/scoping.html上,很好地解释了有光泽的范围规则.有3个环境或级别彼此嵌套:函数内,会话内和所有会话中可用的对象.使用< - 将更改您所在环境中的对象,<< - 将全局更改它,即对于所有会话.

如果我在会话中定义变量但想要在函数中更改它,该怎么办?

< - 只会在函数内更改它,因此其他函数无法读取,<< - 将为所有会话更改它.中间什么都没有?就像"只是一级"?

environment r scoping shiny

7
推荐指数
1
解决办法
4299
查看次数

在承诺中访问'this'

在下面的typescript函数中,'this'不会解析为EmailValidator的实例.如何更正此功能,以便它解析为正确的EmailVaildator实例,以便我可以访问_registerServices?

class EmailValidator {

    constructor(private _registerServices: RegisterServices) { }

    isAvailable(c: AbstractControl): Promise<ValidationResult> {
        let q = new Promise((resolve, reject) => {
            this._registerServices.emailIsAvailable(antiForgeryToken(), c.value)
                .then(result => {
                    // Need to actually check the result.
                    resolve({ "emailtaken": true })
                },
                error => {
                    // Need to communicate the server error? Probably not.
                    resolve({ "servererror": true })
                });
        });

        return q;
    }
}
Run Code Online (Sandbox Code Playgroud)

scoping typescript angular

7
推荐指数
1
解决办法
3710
查看次数

无法在 Python 3 的列表理解中使用 locals() 吗?

下面的代码适用于 Python 2,但不适用于 Python 3。有没有办法在 Python 3 中访问局部变量?或者这些情况的替代解决方案?

[('{name_var}_{i:02d}of{maxpg:02d}.{date_var}').format(i, **locals()) 
  for i in range(start, end)]
Run Code Online (Sandbox Code Playgroud)

Python 3 中的错误:

关键错误:'local_var'

下面是上面的一个更简单的玩具示例(适用于 Python 2,但不适用于 3)

local_var = 'hello'
['{local_var}'.format(**locals()) for i in range(1)]
Run Code Online (Sandbox Code Playgroud)

Python 3 中的错误:

关键错误:'local_var'

python scope list-comprehension scoping python-3.x

7
推荐指数
1
解决办法
1301
查看次数

加倍为真/假

Bjarne建议使用if中的条件作为范围限制.特别是这个例子.

if ( double d = fd()  ) {
   // d in scope here...
}
Run Code Online (Sandbox Code Playgroud)

我很好奇如何以真/假的方式解释声明.

  1. 这是一个宣言
  2. 这是双倍的.

编辑:它在6.3.2.1 C++编程语言中作为推荐.

Edit2:templatetypedefs建议指针,特别是动态强制转换,可能会让人深入了解Bjarnes的建议.

SteveJessop告诉我: - 条件不是表达式它也可以是声明,使用的值是被评估的值.

c++ if-statement type-conversion scoping variable-declaration

6
推荐指数
2
解决办法
1725
查看次数

在类级代码中使用字典理解的Python范围问题

最小的例子

class foo:
    loadings = dict(hi=1)
    if 'hi' in loadings:
        print(loadings['hi']) 
        # works
        print({e : loadings[e] for e in loadings})
        # NameError global name 'loadings' not defined
Run Code Online (Sandbox Code Playgroud)

我也尝试引用类命名空间,但这也不起作用

class foo:
    loadings = dict(hi=1)
    if 'hi' in loadings:
        print(loadings['hi'])
        #works
        print({e : foo.loadings[e] for e in foo.loadings})
        #NameError: name 'foo' is not defined
Run Code Online (Sandbox Code Playgroud)

当然,这可以按预期工作

class foo:
    loadings = dict(hi=1)
    if 'hi' in loadings:
        print(loadings['hi'])

print({e : foo.loadings[e] for e in foo.loadings})
Run Code Online (Sandbox Code Playgroud)

我想了解为什么这个范围问题正在发生,如果我想做一些疯狂的事情,那么最好的方法就是这样做.我的感觉是第一个代码片段应该按原样工作,但当然不是.

目标

我正在为一些csv/json文件创建一个DataManager类/模块以及罐装数据库查询,为我的程序提供一站式服务并获取数据.有一些静态数据和一些动态数据,所以它似乎在同一个类中使用静态和非静态数据成员.虽然我理解这些可能是模块级变量,但我喜欢使用静态类数据成员的概念(可能是因为Java的偏见).任何帮助深表感谢

我的解决方案(暂时)

我最终展开了列表理解以保持在课堂范围内,在上面它会变成这样的东西

class foo:
    loadings = dict(hi=1) …
Run Code Online (Sandbox Code Playgroud)

python csv json scoping

6
推荐指数
1
解决办法
298
查看次数

生成的JavaScript函数中的变量不按预期运行

我在循环中生成函数时遇到了一些JavaScript问题.

我想要的是:

我想要这个工作的方式是一个for循环,每次迭代,生成一个名为doStuff+ 的函数i.例如,第一次迭代将生成doStuff1()第二次生成doStuff2(),依此类推等等.功能本身(为了示例)只需要打印出来i- 即doStuff1()打印1,doStuff2()打印2等.

我得到了什么:

实际发生的是i,不会"坚持"在功能中.它成为全球范围的一部分或其他东西,所以每个功能都是10.如果单击下面代码段中的第一个按钮,则可以看到此信息.

我试过的:

使用生成器功能

在示例二中,我尝试使用function*符号来创建适当的函数生成器.我很确定我之前已经实现了它,但我之前从未使用过这种表示法,所以我可能会离开.如果是这样的话,请告诉我.

其结果与示例2相同.

使用字符串而不是整数

例如三,我决定尝试使用字符串而不是整数,它的工作原理!对于每次迭代,a都附加到一个字符串,所以当我按顺序运行生成的函数时,我会得到一个漂亮的小金字塔a.

在不同的地方声明和分配变量

由于我必须stringOut在示例3 中将变量定义在不同的范围内,所以我决定尝试使用与示例4中的数字相同的变量,并且它再次起作用!这对我来说没有多大意义,因为在更高的范围内似乎更容易遭受与例1和2相同的问题.

我想知道的:

  • 例3和4如何工作,而1和2不工作?编辑:我的代码坏了.它都不起作用.
  • 我是否function*正确使用了发电机声明?
  • 什么是最好的(最简单,最简洁,最易读)的方法呢?我知道制作一系列函数可能是最好的,但在这种情况下这是不可能的.

示例代码:

function test1() {
  document.getElementById("output").innerHTML = "#1 Output:";
  var myFunctions = [];

  for (var i = 0; i < 10; i++) {
    myFunctions[i] = function() {
      document.getElementById("output").innerHTML …
Run Code Online (Sandbox Code Playgroud)

javascript scoping

6
推荐指数
1
解决办法
70
查看次数

局部变量与数据。性能损失巨大

我有一个 VueJS 和 Cesium 项目,它在帧速率下降方面存在性能问题。我知道问题出在哪里,但我不知道为什么或如何解决它。

export default {

    name: "Map",

    components: { ... },

    data: function () {
        return {
            viewer: {}        
        }
    },

    methods: { ... },

    mounted() {

        // 150-200 FPS; but no access to the viewer object outside of this component.
        let viewer = new Viewer('cesiumContainer');

        // 20-30 FPS; but yields me the access I need for other components to utilize.
        this.viewer = new Viewer('cesiumContainer');

        ... rest of my source code ...
    }
Run Code Online (Sandbox Code Playgroud)

我可以将所有需要显示的内容保持在 150-200 FPS 以上,而 …

javascript this scoping cesium vue.js

6
推荐指数
1
解决办法
208
查看次数

在运行时在 Stash 中创建的符号在 Raku 的 PseudoStash 中不可用

这个问题始于我试图弄清楚为什么在运行时创建的符号对EVAL.

外-EVAL.raku

#!/usr/bin/env raku

use MONKEY-SEE-NO-EVAL;

package Foobar {
  our $foo = 'foo';

  our sub eval {
    say OUTER::;
    EVAL "say $bar";
  }
}

Foobar::<$bar> = 'bar';
say $Foobar::bar;

Foobar::eval;

.say for Foobar::;
Run Code Online (Sandbox Code Playgroud)
$ ./outer-EVAL.raku 
===SORRY!=== Error while compiling /development/raku/VTS-Template.raku/scratchpad/./outer-EVAL.raku
Variable '$bar' is not declared
at /development/raku/VTS-Template.raku/scratchpad/./outer-EVAL.raku:10
------>     EVAL "say ?$bar";
Run Code Online (Sandbox Code Playgroud)

认为这与以这种方式创建的符号在PseudoStashs 中不可用有关。但我可能是错的。

外乐

#!/usr/bin/env raku

package Foobar {
  our $foo = 'foo';

  our sub outer {
    say OUTER::;
  }
}

Foobar::<$bar> = 'bar'; …
Run Code Online (Sandbox Code Playgroud)

scope eval scoping raku

6
推荐指数
1
解决办法
88
查看次数