这可能更像是一个范围问题.我正在尝试在$ .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) 在最近与同学的对话中,我一直主张避免全局,除了存储常量.这是一种典型的应用统计类型程序,每个人编写自己的代码和项目大小都很小,所以人们很难看到由于草率的习惯造成的麻烦.
在谈论避免使用全局变量时,我主要关注全局变量可能导致问题的以下原因,但我想在R和/或Stata中使用一些示例来遵循原则(以及您可能认为重要的任何其他原则) ),我很难想出可信的人.
对这个问题的一个有用的答案是一个可重现的,自包含的代码片段,其中全局变量会导致特定类型的麻烦,理想情况下是另一个代码片段,其中问题得到纠正.如有必要,我可以生成更正的解决方案,因此问题的示例更为重要.
相关链接:
Ben Cherry的优秀文章充分阐述了JavaScript中的提升.然而,我的问题是,我不能为这个臭名昭着的混淆犯罪者设想一个用例.请解释是否存在实际利用此语言功能的设计模式.
其次,是JavaScript独有的范围提升?
更新 ---我正在为满足我的好奇心的答案添加赏金:哪种设计模式实际上利用了JavaScript的提升行为?我理解为什么 JavaScript支持提升,但我想知道如何利用这个功能.
例如:
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投掷之外的工作方式.
这编译:
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++头文件中是否安全(和正确)以在命名空间中使用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",还是会污染包含此标头的任何文件的命名空间?
我有以下范围:
scope :comments, :conditions => ['text_value IS NOT NULL']
Run Code Online (Sandbox Code Playgroud)
但我也希望条件说"OR text_value IS not EMPTY"(或者那种效果).
我不想选择任何text_value空/空的行.
我正在编写一个指令,我需要查看更改的父作用域.不确定我是否这样做是首选方式,但它不能使用以下代码:
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) 我刚刚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?