如何强制函数创建全局变量
How to force function to create global variable
如何强制函数创建全局变量?我有这样的代码:
$.ajax({
url: 'https://dl.dropboxusercontent.com/s/11ofmbg4d4y3gb0/zakaznice_tyden.csv',
dataType: 'text',
}).done(successFunction);
function successFunction(data) {
var promenna = data.replace(/'n/g,";").split(";");
var result = [];
for (var i = 0; i < promenna.length; i+=2) {
var line = [];
line.push(promenna[i]);
line.push(promenna[i+1]);
result.push(line);
}
for (var i = 0; i < result.length; i += 1){
$("#tyden" + i + "").append(result[i][0]);
$("#tyden" + i + "kolik").append(result[i][1]);
}
}
它加载csv文件并从中创建数组。我如何使数组"行"全局可达?
Scope It Outside Function Scope
如果可以的话,最常见的方法可能是简单地在函数作用域之外声明它:
// This will be globally accessible from any child functions, etc.
var array = [];
function example(){
// Your code here can access the array as expected
}
隐含全局声明
如果你想声明一个具有全局作用域的变量,在声明它时省略var
,它将隐式地全局创建它:
function example(){
// This will be a global variable
array = [];
}
注意:这在严格模式下不起作用,严格模式会取消隐式全局变量。您可以在这里阅读有关此方法的更多信息。
存储变量
另一个很好的方法是简单地将对象作为属性存储在window
对象上,并从那里访问它,正如Pamblam的回答中提到的那样。
你可以显式地将任何变量赋值给window
对象,使其成为"全局"。
function things(){
window.stuff = "junk";
}
things();
alert(stuff);
尽管您想要的是可以实现的,但我还是不建议使用全局变量,并鼓励您重新考虑您的体系结构。全局变量很难维护,而且可能导致错误。
var
总是创建一个具有函数作用域的变量,因此这意味着它可以在该函数中声明的函数和该函数中的所有函数中访问(除非在它们内部重新定义)。如果你想让它在任何位置都是全局的,你有几个选项:
直接赋值给不存在的变量
如果您在非严格模式下运行代码,只需删除var
。这将导致查找变量line
,并且由于没有在任何上下文中声明它,因此将其作为全局变量赋值。例子:
function fn() {
line = 1;
}
fn();
console.log(line); //1
有两个缺点:
- 如果您在严格模式下运行此代码,将导致
ReferenceError
- 如果在某个外部函数中有一个同名的变量,它将被覆盖,并且不会创建全局变量
的例子:
function outer() {
var line;
function inner {
line = 8; //won't work because there is variable line in some outer context
}
inner();
}
outer();
console.log(line); //undefined
全局对象赋值
在每个JS执行环境中都有一个叫做全局对象的东西。如果你给它赋一个属性,你可以把它当作一个全局变量来使用(除了它不是一个变量——区别很微妙,但确实存在)。例如:
function fn() {
window.line = 1;
}
fn();
console.log(line); //1;
这也有一些缺点:
- 全局对象不一定隐藏在
window
变量下。在Node中,它是global
,在其他执行环境中可能会有所不同 - 如果在途中声明了一个名为
window
(或global
)的变量,它将覆盖该变量(类似于上一点的缺点#2) - 你可以使用
this
来访问全局对象,但只能在非严格模式下,并且this
没有明确设置(参见计算this
值的规则)
间接eval/new Function
间接eval
和new Function
总是像在全局作用域中直接声明一样执行。尽管它们并不优雅且容易出错(使用字符串编写代码),但它们没有以前的缺点——即使在严格模式下也可以工作,无论在过程中声明了什么变量,并且独立于执行环境。就这么简单:
'use strict';
function fn() {
//choose one of the following:
//indirect eval:
(0, eval)('line=1');
//or new Function
new Function('line=1')();
}
fn();
console.log(line); //1. Works even in strict mode
你可能会问"为什么这个奇怪的(0, eval)(...)
而不是eval
?"这就是所谓的间接eval,你可以在SO答案
如你所见,这是可能的。但是,全局变量再次使代码难以维护。您应该将line
变量的范围限制在实际使用的区域内。
- 在节点中创建文件全局变量
- 创建要在其他函数中使用的全局变量
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 如何在javascript中创建全局变量(使用webpack)
- 如何使用局部变量创建全局变量
- 创建不带 var 关键字的全局变量时出现意外行为
- 在 Javascript 中创建全局变量时是否需要指定对象类型
- 在CrossRider内部创建的全局变量's的appAPI.ready()函数对页面不可用
- TypeScript:从模块创建全局变量
- 如何在函数中创建全局变量
- YUI3 - 创建全局变量以避免使用 .use(..);
- CoffeeScript 在 'for v in values' 中创建一个全局变量 'v',导致事件中的错误引用
- 我是否正在创建一个全局变量
- 创建/访问在 AJAX 调用中创建的 Javascript 全局变量
- 这行是在创建全局变量吗
- 创建一个类来保存javascript中的全局变量
- 如何在WSO2ESB中创建全局变量-必须是可更新的
- 如何从 Tumblr 主题选项的输出创建全局变量
- 用JavaScript创建队列并访问匿名函数中的全局变量
- Javascript:我怎样才能创建一个1.接受全局变量作为参数2.更改全局变量的值