Javascript I';我听说全局变量不好,我应该使用什么替代方案?

Javascript I';我听说全局变量不好,我应该使用什么替代方案?,javascript,global-variables,Javascript,Global Variables,我在各地都读到了应该使用的方法和替代方法。特别是在Javascript中,我应该选择什么解决方案 我在想一个函数,当输入两个参数(function globalVariables(Variable,Value))时,它会查看变量是否存在于本地数组中,并且如果它确实将其值设置为Value,否则,Variable和Value会被追加。如果调用该函数时没有参数(函数globalVariables()),它将返回数组。如果函数仅使用一个参数(function globalVariables(Variab

我在各地都读到了应该使用的方法和替代方法。特别是在Javascript中,我应该选择什么解决方案

我在想一个函数,当输入两个参数(
function globalVariables(Variable,Value)
)时,它会查看变量是否存在于本地数组中,并且如果它确实将其值设置为
Value
,否则,
Variable
Value
会被追加。如果调用该函数时没有参数(
函数globalVariables()
),它将返回数组。如果函数仅使用一个参数(
function globalVariables(Variable)
)激发,它可能会返回数组中
Variable
的值

你觉得怎么样?我想听听你们关于使用全局变量的替代解决方案和论点

如何使用
globalVariables()
这是顺便说一句吗?

在这个特定的场景中,一个函数可能会在某个时间点设置一个变量,而在很久以后,另一个函数可能会在用户提交表单时需要获取该变量。因此,第一个函数无法将变量作为参数传递给后面的函数,因为它永远不会从第一个函数调用


谢谢你,我感谢你的帮助

解决方案的问题在于,它只会使您的代码更难理解,同时仍然保留全局变量的所有缺点。您链接到的页面涵盖了这些问题。您提出的解决方案真正解决的唯一问题是名称空间污染,但代价是无法像声明是函数调用那样轻松地看到声明了哪些全局变量)


解决方案是编写没有全局变量的代码。如果函数需要一个值,则将其作为参数传递。

您确实不想这样做。
关于原因,请参见此处的顶部帖子:

作为旁注,您可以始终执行“全局”代码,而不会在其中乱丢全局代码:

(函数(){
var=1;
警报(全球);
})();

//notaglobal未在此范围内定义
全局状态会导致多个领域出现问题。一个是代码重用。当您访问某个全局状态时,这意味着组件必须知道它的环境(自身之外的东西)。您应该尽可能避免这种情况,因为这会使组件不可预测

假设我有一个访问globalVariables函数的对象,我想在另一个页面中使用它。我如何知道如何定义globalVariables对象,甚至如何定义它?但是,如果您可以将信息传递到构造函数或作为函数的参数,那么我可以轻松确定对象需要什么


此外,当您访问或修改全局范围时,也可能会影响其他对象。这就是为什么像jquery这样的库在全局范围内只使用一个名称(尽可能少)。它减少了与其他库发生冲突的可能性。换句话说,全局范围超出了您的控制范围,因此它是危险的。

我的孩子。语义学

从一个全局变量开始:myApp={}; 一切都应该在那里面。唯一的例外是AJAX库(有一些极端的例外,比如使用JSONP回调)

myApp中应该只有很少的属性。您需要将应用程序属性保存在容器中,如配置或设置

myApp = {
    config:{
        prop:1
    },
    settings:{
        prop:2
    },
    widgets:{
        List: function(props){},
        Item: function(props){}
    }
}
然后,在较低的模块、组件、单例和类构造函数(小部件)中可能会有更多的属性

此设置使您能够从任何其他位置访问任何属性,因为您可以通过myApp global获得该属性。但是,您应该尽可能使用“this”,因为查找速度更快。直接设置属性,不用担心伪getter/setter。如果你真的需要一个getter/setter,那么就为这个特定的用途编写代码

你的例子不起作用的原因是它太笼统了,你似乎在寻找一个在全球范围内工作的借口

不要对私有变量太聪明。它们也很糟糕:
在javascript中不鼓励使用全局变量的主要原因是,在javascript中,所有代码都共享一个全局名称空间,而且javascript也包含了隐含的全局变量,即未在局部范围中显式声明的变量会自动添加到全局名称空间中。过于依赖全局变量可能会导致同一页面上的不同脚本之间发生冲突(读取)

减少全局变量的一种方法是使用。基本思想是将所有代码封装在一个函数中,该函数返回一个对象,该对象包含需要在模块外部访问的函数,并将返回值赋给单个全局变量

var FOO = (function() {
    var my_var = 10; //shared variable available only inside your module

    function bar() { // this function not available outside your module
        alert(my_var); // this function can access my_var
    }

    return {
        a_func: function() {
            alert(my_var); // this function can access my_var
        },
        b_func: function() {
            alert(my_var); // this function can also access my_var
        }
    };

})();

现在要在其他地方使用模块中的函数,请使用
FOO.a_func()
。这种解决全局名称空间冲突的方法,您只需更改
FOO

的名称,使用全局变量通常是一种不好的做法,无论选择何种语言。他们甚至不(容易)允许使用时,在,我强烈建议

考虑我发现的这段代码:

if (typeof session != 'undefined' && !data.cart.request_status)
  data.input_definitions.passengers =
    inflate_passenger(session, data.input_definitions.passengers);
我需要转过身去问一个felow程序员这个
会话
变量是从哪里来的,因为没有显示在哪里设置了代码搜索

我从该公司得到了另一个设置全局变量的包。 这就像一个笑话:如果你需要解释它,它可能没有那么好

使用ES6的变通方法:

如果在节点处,使用
import
require
将所需内容带入词汇范围,不要让人们在您不知情的情况下接触您的全局环境

import {Sesssion} from 'api-core';
const Session = require('api-core').session;
如果您在前端为浏览器提供代码,则不能使用
import
,除非您使用

使用Gulp.js进行传输的示例:
import {Sesssion} from 'api-core';
const Session = require('api-core').session;
// $ npm install --save-dev gulp-babel babel-preset-es2015

// gulpfile.js
const gulp  = require('gulp');
const babel = require('gulp-babel');

gulp.task('transpile', () => {
  return gulp.src('src/app.js')
    .pipe(babel({presets: ['es2015']}))
    .pipe(gulp.dest('dist'));
});

// $ gulp transpile
// scripts/app.js
var MyApp = {
  globals: {
    foo: "bar",
    fizz: "buzz"
  }
};