标签: scope

在$ .getJSON函数期间设置的变量只能在函数内访问

这可能更像是一个范围问题.我正在尝试在$ .getJSON函数中设置JSON对象,但我需要能够在回调之外使用该对象.

var jsonIssues = {};  // declare json variable

$.getJSON("url", function(data) {
    jsonIssues = data.Issues;
});

// jsonIssues not accessible here
Run Code Online (Sandbox Code Playgroud)

在另一篇文章中提到了类似这样的问题,并且一致认为我需要在JSON对象中做的任何事情都需要在回调函数中完成,并且不能在其他任何地方访问.我真的没办法在$ .getJSON回调之外继续访问/操作那个JSON对象吗?如何返回变量或设置全局?

我很感激任何帮助.这似乎不对......

更新:

尝试将$ .ajax()异步设置设置为false,并运行相同的代码,没有运气.我试过的代码如下:

var jsonIssues = {};  // declare json variable

$.ajax({ async: false });

$.getJSON("url", function(data) {
    jsonIssues = data.Issues;
});

// jsonIssues still not accessible here
Run Code Online (Sandbox Code Playgroud)

另外,我有几个响应,全局变量应该可以正常工作.我应该澄清所有这些代码都在其中$(document).ready(function() {.要设置全局变量,我应该在document.ready之前声明它吗?因此:

var jsonIssues = {};

$(document).ready(function() {

  var jsonIssues = {};  // declare json variable

  $.getJSON("url", function(data) {
      jsonIssues = data.Issues;
  });

  // now …
Run Code Online (Sandbox Code Playgroud)

javascript variables jquery scope callback

45
推荐指数
3
解决办法
6万
查看次数

C++ - 未初始化的向量<int>的值

我从答案明白这个问题 是全局/静态初始化为int值将为0回答这一说,对向量,对象类型的默认构造函数将被调用.

我无法弄清楚 - 当我vector<int> v(10)在本地函数中时会发生什么 .int的默认构造函数是什么?如果我在vector<int> v(10)全球宣布怎么办?

我所看到的是, vector<int> v(10)在本地函数中导致变量为0 - 但我不确定这是因为我的编译器还是固定的预期行为.

c++ scope initialization vector

44
推荐指数
3
解决办法
5万
查看次数

R和Stata中全局变量危险的例子

在最近与同学的对话中,我一直主张避免全局,除了存储常量.这是一种典型的应用统计类型程序,每个人编写自己的代码和项目大小都很小,所以人们很难看到由于草率的习惯造成的麻烦.

在谈论避免使用全局变量时,我主要关注全局变量可能导致问题的以下原因,但我想在R和/或Stata中使用一些示例来遵循原则(以及您可能认为重要的任何其他原则) ),我很难想出可信的人.

  • 非本地化:Globals使调试更难,因为它们更难理解代码流
  • 隐式耦合:Globals通过允许远程代码段之间的复杂交互来打破函数式编程的简单性
  • 命名空间冲突:重用通用名称(x,i等),导致命名空间冲突

对这个问题的一个有用的答案是一个可重现的,自包含的代码片段,其中全局变量会导致特定类型的麻烦,理想情况下是另一个代码片段,其中问题得到纠正.如有必要,我可以生成更正的解决方案,因此问题的示例更为重要.

相关链接:

全局变量很糟糕

全球变量是否不好?

scope r global-variables stata

44
推荐指数
7
解决办法
3438
查看次数

哪种设计模式利用了JavaScript的提升行为?

Ben Cherry的优秀文章充分阐述了JavaScript中的提升.然而,我的问题是,我不能为这个臭名昭着的混淆犯罪者设想一个用例.请解释是否存在实际利用此语言功能的设计模式.

其次,是JavaScript独有的范围提升?

更新 ---我正在为满足我的好奇心的答案添加赏金:哪种设计模式实际上利用了JavaScript的提升行为?我理解为什么 JavaScript支持提升,但我想知道如何利用这个功能.

javascript scope hoisting

44
推荐指数
6
解决办法
4174
查看次数

为什么Try/Catch块会创建新的变量范围?

例如:

try
{
    SomeObject someObject = new SomeObject();
    someObject.dangerousMethod();
}
catch(Exception e)
{
}
someObject.anotherMethod(); //can't access someObject!
Run Code Online (Sandbox Code Playgroud)

但你可以在try/catch块之前声明它然后它工作正常:

SomeObject someObject;
try
{
    someObject = new SomeObject();
    someObject.dangerousMethod();
}
catch(Exception e)
{
}
someObject.anotherMethod(); //works fine
Run Code Online (Sandbox Code Playgroud)

我只是想知道这个的设计原因.为什么在try/catch块内创建的对象不在方法的其余部分范围内?也许我不会深入了解try/catch除了观看Exceptions投掷之外的工作方式.

java scope try-catch

44
推荐指数
4
解决办法
3万
查看次数

为什么在lambdas中隐式捕获const int(或short)?

这编译:

int main() {
    const int x = 123;
    auto g = []() { std::cout << x << "\n"; };
    g();
}
Run Code Online (Sandbox Code Playgroud)

但是这个:

int main(){
    const float x = 123;
    auto g = []() { std::cout << x << "\n"; };
    g();
}
Run Code Online (Sandbox Code Playgroud)

生产:

"错误:'x'未被捕获"

为什么?

我已经在GCC(各种版本从5.0.0到8.0.0)和Clang(各种版本从4.0.0到6.0.0)上测试过它.它在所有情况下都表现相同.

c++ lambda scope one-definition-rule language-lawyer

44
推荐指数
2
解决办法
1595
查看次数

在命名空间内使用声明的范围

在C++头文件中是否安全(和正确)以在命名空间中使用using声明,如下所示:

#include <boost/numeric/ublas/vector.hpp>
namespace MyNamespace {
    using boost::numeric::ublas::vector;
    vector MyFunc(vector in);
}
Run Code Online (Sandbox Code Playgroud)

即,正确地包含在MyNamespace块中的"使用boost :: numeric :: ublas :: vector",还是会污染包含此标头的任何文件的命名空间?

c++ scope namespaces using

43
推荐指数
3
解决办法
2万
查看次数

Rails范围为IS NOT NULL并且不为空/空白?

我有以下范围:

scope :comments, :conditions => ['text_value IS NOT NULL']
Run Code Online (Sandbox Code Playgroud)

但我也希望条件说"OR text_value IS not EMPTY"(或者那种效果).

我不想选择任何text_value空/空的行.

sql postgresql scope ruby-on-rails

43
推荐指数
4
解决办法
3万
查看次数

Angularjs注意父范围的变化

我正在编写一个指令,我需要查看更改的父作用域.不确定我是否这样做是首选方式,但它不能使用以下代码:

  scope.$watch(scope.$parent.data.overlaytype,function() {
    console.log("Change Detected...");
  })
Run Code Online (Sandbox Code Playgroud)

它记录了窗口加载,但即使更改了overlaytype,也不会再次登录.

我怎样才能注意overlaytype变化?

编辑:这是整个指令.不完全确定为什么我会得到一个儿童范围

/* Center overlays vertically directive */
aw.directive('center',function($window){
  return {
    restrict : "A",
    link : function(scope,elem,attrs){

      var resize = function() {
        var winHeight = $window.innerHeight - 90,
            overlayHeight = elem[0].offsetHeight,
            diff = (winHeight - overlayHeight) / 2;
            elem.css('top',diff+"px");
      };

      var watchForChange = function() {
        return scope.$parent.data.overlaytype;
      }
      scope.$watch(watchForChange,function() {
        $window.setTimeout(function() {
          resize();
        }, 1);
      })

      angular.element($window).bind('resize',function(e){
        console.log(scope.$parent.data.overlaytype)
        resize();
      });
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

javascript scope angularjs

43
推荐指数
4
解决办法
6万
查看次数

NodeJS中的"全局"对象是什么

我刚刚this在NodeJS环境中看到了关键字的奇怪行为.我用代码列出它们.我NodeJS v6.x用一个JavaScript文件运行这些代码.

在使用以下一行代码进行测试时,无论是否使用该'use strict'语句,都指向一个空对象{}.

console.log(this)
Run Code Online (Sandbox Code Playgroud)

但是,当我在自执行函数中运行语句时,

(function(){
  console.log(this);
}());
Run Code Online (Sandbox Code Playgroud)

它正在打印一个非常大的对象.在我看来环境创建的全局执行上下文对象NodeJS.

在使用'use strict'语句执行上述功能时,预计会打印undefined

(function(){
  'use strict';

  console.log(this);
}());
Run Code Online (Sandbox Code Playgroud)

但是,在使用浏览器(我只测试过Chrome)时,前三个示例产生window对象,最后一个示例undefined按预期方式给出.

浏览器的行为是可以理解的.但是,如果是NodeJS,它不会创建执行上下文,直到我在函数内部包装?

那么,大多数代码NodeJS运行时都是空的全局 object

javascript scope global this node.js

43
推荐指数
5
解决办法
2万
查看次数